팩토리 메소드 패턴 소개:
팩토리 메소드 패턴의 의미는 제품 객체를 생성하는 팩토리 인터페이스를 정의하고 실제 생성 작업을 서브클래스로 미루는 것입니다. 핵심 팩토리 클래스는 더 이상 제품 생성을 담당하지 않습니다. 이러한 방식으로 핵심 클래스는 특정 팩토리 하위 클래스가 구현해야 하는 인터페이스만 담당하는 추상 팩토리 역할이 됩니다. 추가 추상화의 이점은 팩토리 메서드 패턴입니다. 특정 공장 역할을 수정하지 않고도 시스템을 운영할 수 있습니다.
팩토리 메소드 패턴 구조 다이어그램:
역할 분류:
추상 팩토리 역할: 팩토리 메소드 패턴의 핵심이며, 응용 프로그램과 관련이 있습니다. 할 일이 없습니다. 패턴으로 생성된 객체에 대한 모든 팩토리 클래스는 이 인터페이스를 구현해야 합니다.
구체적인 팩토리 역할: 추상적인 팩토리 인터페이스를 구현하는 구체적인 팩토리 클래스로, 애플리케이션과 밀접하게 관련된 로직을 포함하고, 제품 객체를 생성하기 위해 애플리케이션에 의해 호출됩니다.
추상적인 제품 역할: 애플리케이션에 의해 생성된 객체 팩토리 메소드 패턴 슈퍼 유형은 제품 객체의 공통 상위 클래스 또는 공통 소유 인터페이스입니다. 위 사진에서 이 캐릭터는 라이트입니다.
구체적인 제품 역할: 이 역할은 추상적인 제품 역할에 의해 정의된 인터페이스를 구현합니다. 특정 제품은 특정 공장에서 생산되며, 이들 사이에는 일대일 대응이 이루어지는 경우가 많습니다.
실제 사례 소개 :
이전 블로그 포스팅 Simple Factory Pattern에서는 Simple Factory Pattern을 이용하여 다음과 같은 구현을 진행하였습니다. 상주 관리 시스템이 있는 경우 그 안에 상주 유형을 변수이므로 임차인 유형별로 임대료 계산식에 차이가 있습니다. 예를 들어 A 유형 거주자의 임대료 = 일수 * 단가 + 성과 * 0.005 B 유형 거주자의 임대료 = 월 * (월) 가격 + 성능 * 0.001) 여기서는 고객의 요구 사항이 충족되었지만 나중에 고객이 C 유형 저장소와 D 유형 저장소를 추가해야 하고 알고리즘 요구 사항이 다른 경우 이때 C 및 D 유형 저장소를 생성해야 합니다. D-type은 Ishop 인터페이스를 상속하고 내부에 메소드를 구현하려면 계속해서 팩토리 클래스를 수정하고 스위치에 케이스를 추가하여 해당 스토어 객체를 캡처하고 생성해야 합니다. 이러한 상황이 발생하면 확장성에 해를 끼칠 수 있습니다. 프로그램의 유지 및 이후 프로젝트의 유지 관리.
1. 분석: 매장은 공통적인 행동 특성을 가지며 매장 임대료 계산 동작을 수행해야 합니다. 구현하려는 매장 임대료 계산 동작이 포함된 Ishop을 추상화했습니다.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FactoryEntiy { public interface Ishop { double Getrent(int days, double dayprice, double performance); } }
2. Isho 인터페이스에서 메소드를 구현하고 유형 A 및 B 스토어를 생성합니다.
using FactoryEntiy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductEnity { /// <summary> /// 继承商店接口,实现里面的行为方法,即算法 /// </summary> public class Ashop:Ishop { /// <summary> /// /// A类型商店租金额,天数*单价+绩效*0.005 /// </summary> /// <param name="days">天数</param> /// <param name="dayprice">每天单价</param> /// <param name="performance">日平均绩效</param> /// <returns></returns> public double Getrent(int days, double dayprice, double performance) { Console.WriteLine("A商店的租金算法"); return days * dayprice + performance * 0.01; } } }
using FactoryEntiy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductEnity { /// <summary> /// 继承商店接口,实现里面的行为方法,即算法 /// </summary> public class Bshop:Ishop { /// <summary> /// B类型商店的租金=月份*(每月价格+performance*0.001) /// </summary> /// <param name="month">月数</param> /// <param name="monthprice">月单价</param> /// <param name="performance">月平均绩效</param> /// <returns></returns> public double Getrent(int month, double monthprice, double performance) { Console.WriteLine("B商店的租金算法"); return month * (monthprice + performance * 0.001); } } }
3. 이제 매장 엔터티를 생성하고, 다양한 매장의 임대료를 계산하고, 향후 추가 및 수정을 용이하게 하는 상황을 고려해보세요. 그래서 우리는 구현할 저장소 개체를 생성하는 메서드가 포함된 IFactroy 인터페이스를 생성합니다.
using FactoryEntiy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FactoryMethod { /// <summary> /// 工厂类,创建商店类型实体 /// </summary> public interface IFactory { Ishop CreateShop(); } }
4. 이제 IFactory에서 상속하고 해당 저장소 객체를 생성할 수 있습니다.
using FactoryEntiy; using FactoryMethod; using ProductEnity; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductEnity { /// <summary> /// 继承工厂类,创建A类型商店实体 /// </summary> public class CreateBshop : IFactory { public Ishop CreateShop() { return new Ashop(); } } }
using FactoryEntiy; using FactoryMethod; using ProductEnity; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ProductEnity { /// <summary> /// 继承工厂类,创建B类型商店实体 /// </summary> public class CreateAshop : IFactory { public Ishop CreateShop() { return new Bshop(); } } }
5. 그런 다음 현재 상점 유형을 기준으로 이 상점 유형에 어떤 알고리즘을 사용해야 하는지 판단합니다.
using FactoryEntiy; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Reflection; using System.Text; namespace FactoryMethod.App { class Program { static void Main(string[] args) { string shopname = ConfigurationManager.AppSettings["CreateShopClassName"]; //shopname为创建商店类名称,此处=CreateAshop IFactory af = (IFactory)Assembly.Load("ProductEnity").CreateInstance("ProductEnity." + shopname); //第一个ProductEnity是dll的名称,第二个ProductEnity是项目的命名空间。 Ishop As = af.CreateShop(); double total = As.Getrent(30, 300, 2000); //30 天/100元 日平均绩效为2000 Console.WriteLine("该A类型商店的租金为:" + total); Console.WriteLine("============="); IFactory bf = (IFactory)Assembly.Load("ProductEnity").CreateInstance("ProductEnity." + "CreateBshop"); //CreateBshop可以保存为配置或者存在数据库中, //注意该保存字符串应该与项目中创建的类名一样, //否则反射的方式会找不到该项目下的类。 Ishop Bs = bf.CreateShop(); total = Bs.Getrent(30, 300, 2000); //30 天/100元 日平均绩效为2000 Console.WriteLine("该A类型商店的租金为:" + total); } } }
여기에서는 리플렉션을 사용하여 객체를 생성합니다. 스위치를 통해 객체를 생성하는 이전 팩토리 클래스의 방식을 대체하는 것은 이후에 새로운 유형의 저장소를 추가하고 알고리즘을 수정, 추가 및 유지 관리하는 데 도움이 됩니다. 향후 프로젝트 요구 사항이 변경되면 C만 다시 추가하면 됩니다. 및 D 유형 저장소를 프로젝트에 추가하고 Ishop 구현에서 메소드를 상속하는 동시에 상속된 IFactroy 인터페이스를 추가하고 해당 저장소 개체를 생성하고 프로젝트의 ProductEnity.dll을 컴파일한 다음 C를 계산합니다. 반영을 통해 D형 저장 알고리즘을 수정해야 합니다.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되길 바라며, 또한 PHP 중국어 홈페이지를 응원해주시기 바랍니다.