工厂方法模式
The Factory Method design pattern defines an interface for creating an object , but let subclasses decide which class to instantiate. This pattern lets a class defer instantiation to subclass.
UML Class Diagram
Product: This is an interface for creating objects, here, we need to define the operations a product should have.
ConcreteProduct: This is a class that implements the Product interface.
Creator: This is an abstract class or interface that declares the facotry method, which returns an object of type product.
ConcreteCreator: there are the classes that implement the Abstract class or interface and override the factory method to return an instance of the Concrete Product.
Structure Code IN C#
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface ICreditCard { string GetCardType(); Int32 GetCardLimit(); Int32 GetAnnualCharge(); } public class MoneyBack : ICreditCard { public int GetAnnualCharge() => 500; public int GetCardLimit() => 10000; public string GetCardType() => "MoneyBack"; } public class PlatiumCard : ICreditCard { public int GetAnnualCharge() => 600; public int GetCardLimit() => 20000; public string GetCardType() => "Platium"; } public class Titanium : ICreditCard { public int GetAnnualCharge() => 800; public int GetCardLimit() => 50000; public string GetCardType() => "Titanium"; }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public interface ICreditCardFactory { ICreditCard CreateCreditCard(); } public class MoneyBackFactory : ICreditCardFactory { public ICreditCard CreateCreditCard() { return new MoneyBack(); } } public class PlatiumFactory : ICreditCardFactory { public ICreditCard CreateCreditCard() { return new PlatiumCard(); } } public class TitaniumFactory : ICreditCardFactory { public ICreditCard CreateCreditCard() { return new Titanium(); } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
var titaniumFactory = new TitaniumFactory(); var titanium = titaniumFactory.CreateCreditCard(); Console.WriteLine($"The credit card type: {titanium.GetCardType()}, limit: {titanium.GetCardLimit()}, annual charge: {titanium.GetAnnualCharge()}");
工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类来决定实例化哪一个类。工厂方法使一个类的实例化延迟到其他子类。
与简单工厂的对比:
简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法实现时,客户端需要决定实例化哪一个工厂来实例化具体的类,选择判断的问题还是存在的,也即是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来时改工厂类的,而现在要改客户端。