【原】从头学习设计模式(二)——简单工厂模式
一、引入
简单工厂模式在开发中应用的情况也非常多,但其并不是GOF二十三种设计模式之一,最多只能算作是工厂方法模式的一种特殊形式,从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
二、类图
下面通过比较直观的类图来说明一下
1.首先需要定义一个通用接口IProduct,作为构造实例的类型
2.定义不同的产品类 (Product_A和Product_B),均继承该接口,并各自实现接口定义的方法
3.构造工厂类,并定义Creator方法(一般是static的),通过Creator的方法参数,在方法体内判断应该构造哪种类型的对象并返回(返回类型统一为IProduct)
三、代码结构
由上面的类图,我们很容易得到类似下面的代码:
private static void Main(string[] args) { IProduct product1 = Factory.Creator(ProductName.Product_A); product1.BeCreated(); IProduct product2 = Factory.Creator(ProductName.Product_B); product2.BeCreated(); Console.ReadKey(); }
/// <summary> /// 接口 /// </summary> public interface IProduct { void BeCreated(); } /// <summary> /// Product_A类型 /// </summary> public class Product_A : IProduct { public void BeCreated() { Console.WriteLine("Product_A has been created!"); } } /// <summary> /// Product_B类型 /// </summary> public class Product_B : IProduct { public void BeCreated() { Console.WriteLine("Product_B has been created!"); } } /// <summary> /// 简单工厂类 /// </summary> public class Factory { public static IProduct Creator(ProductName name) { if(name ==ProductName.Product_A) { return new Product_A(); } else if (name == ProductName.Product_B) { return new Product_B(); } else { throw new Exception("Product Name is invalid."); } } } /// <summary> /// 可构造的产品类型的名称 /// </summary> public enum ProductName { Product_A, Product_B }
简单工厂模式就像它的名字一样简单,总结起来就是一个产品接口,一个实现了产品接口的产品,和一个工厂类,这个工厂类根据要传入的方法参数去创造一个具体的产品然后转型为接口类型返回。
四、简单工厂模式的优缺点
优点:
通过使用工厂类,外界不再需要关心如何创造各种具体的产品,只要提供一个产品的名称作为参数传给工厂,就可以直接得到一个想要的产品对象,并且可以按照接口规范来调用产品对象的所有功能(方法)。
构造容易,逻辑简单。
缺点:
1.细心的朋友可能早就发现了,这么多if else判断完全是Hard Code啊,如果我有一个新产品要加进来,就要同时添加一个新产品类,并且必须修改工厂类,再加入一个 else if 分支才可以, 这样就违背了 “开放-关闭原则”中的对修改关闭的准则了。当系统中的具体产品类不断增多时候,就要不断的修改工厂类,对系统的维护和扩展不利。那有没有改进的方法呢?在工厂方法模式中会进行这方面的改进。
2.一个工厂类中集合了所有的类的实例创建逻辑,违反了高内聚的责任分配原则,将全部的创建逻辑都集中到了一个工厂类当中,因此一般只在很简单的情况下应用,比如当工厂类负责创建的对象比较少时。