概述
定义一个用于创建对象的接口,让之类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其之类
工厂方法模式”是对简单工厂模式的进一步抽象化,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,仅负责声明具体工厂子类必须实现的接口。
结构图
代码实现
产品
/// <summary> /// 产品接口 /// </summary> public interface Product { void Operation(); }
/// <summary> /// 具体产品A /// </summary> public class ConcreteProductA : Product { public void Operation() { Console.WriteLine("执行a操作"); } }
/// <summary> /// 具体产品B /// </summary> public class ConcreteProductB : Product { public void Operation() { Console.WriteLine("执行b操作"); } }
工厂
/// <summary> /// 工厂接口 /// </summary> public interface Creator { Product CeateProduct(); }
/// <summary> /// 对应A产品实现的工厂 /// </summary> public class ConcreteCreatorA : Creator { public Product CeateProduct() { return new ConcreteProductA(); } }
/// <summary> /// 对应B产品实现的工厂 /// </summary> public class ConcreteCreatorB : Creator { public Product CeateProduct() { return new ConcreteProductB(); } }
客户端
class Program { static void Main(string[] args) { Creator creatorb = new ConcreteCreatorB(); Product product = creatorb.CeateProduct(); product.Operation(); Creator creatora = new ConcreteCreatorA(); product = creatora.CeateProduct(); product.Operation(); Console.ReadKey(); } }
工厂方法和简单工厂的区别
简单工厂是将创建产品的过程封装在简单工厂中,而工厂方法模式是将工厂进行了抽象,具体创建何种产品需要进行对工厂的实现,使用时在由客户端决定使用何种工厂这样看好像创建逻辑又耦合进了客户端中
对于简单创建过程简单工厂还适用,但是当一个对象创建很复杂这就可以考虑使用工厂方法模式,对于对象创建过程非常简单的使用简单工厂模式即可
工厂方法模式提供了工厂类的抽象,这也为依赖注入的使用提供了很好的基础,更加符合oop原则
优势
其好处是可以使系统在不修改原来代码的情况下引进新的产品,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。即满足开闭原则。
用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
使用场景
客户只知道创建产品的工厂名,而不知道具体的产品名。
创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
客户不关心创建产品的细节
缺陷
类的个数容易过多,增加复杂度
增加了系统的抽象性和理解难度