创建型模式之工厂方法模式
常见问题
客户程序要获取一个产品的实例,这个产品是变化的,但是这个产品抽象的接口是稳定的。当这个产品发生变化时,要求客户程序不变或者变化很小。我们该怎么实现呢?
分析问题
要使产品发生变化时客户程序不变或者变化很小,就得使客户程序与产品之间建立松耦合,将客户程序对对象的依赖转移成对其他稳定对象的依赖。在客户程序与产品之间添加一个中间件,中间件来创建产品实例,客户程序直接使用中间件创建的实例。
解决方案
方案一:在客户程序与产品之间添加一个实现类,这个类负责创建产品的实例,客户程序通过这个类来获取产品的实例。也就是简单工厂模式,由工厂类根据客户程序传入的参数动态决定创建哪件产品的实例。
简单工厂类一般做为工具使用,将简单工厂类的构造方法定义为私有的,简单工厂类的行为方法都定义为静态的。
简单工厂类和类中的行为方法的命名都是有讲究的,一般简单工厂类的命名为:“模块名称 + Factory ” ;行为方法的命名为:“Get + 接口名称”。
产品
View Code
public interface IProduct { string GetOperationName(); } public class ProductA : IProduct { public string GetOperationName() { return "ProductA"; } } public class ProductB : IProduct { public string GetOperationName() { return "ProductB"; } }
简单工厂类
View Code
public class ProductFactory { public static IProduct GetProduct(int type) { IProduct product = null; if (type == 1) { product = new ProductA(); } else if (type == 2) { product = new ProductB(); } return product; } }
客户程序
View Code
class Program { static void Main(string[] args) { IProduct product = ProductFactory.GetProduct(1); string productName = product != null ? product.GetOperationName() : "空对象"; Console.WriteLine(string.Format("客户程序想要获取 “{0}” 的实例", productName)); Console.ReadKey(); } }
运行结果
方案二:工厂类和产品类依次对应。即一个抽象工厂类对应一个产品接口,一个具体工厂类对应一个具体产品类,这个具体的工厂就负责创建对应的具体产品的实例。
系统在不修改工厂类的情况下就可以扩展新产品。比方案二更好的实现了开闭原则。

扩展


浙公网安备 33010602011771号