一、引言
在程序开发中经常会有对象的创建,当需要创建一个对象时,通过new进行创建。当程序功能进行升级时,添加新的对象时,则需要修改代码进行再一次new对象,这样导致代码维护量特别大。这节通过讲解简单工厂、抽象工厂模式,来解决这个问题。
工厂模式是一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变。
工厂模式是定义一个用户创建对象的接口,让子类决定实例化那一个类。Factory Method使一个类的实例化延迟到子类。如图:
简单工厂模式是负责生产对象的一个类,将在客户端对象的操作,简单的转移到工厂中。
二、程序设计改进
针对简单工厂模式的缺点(系统难以扩展),工厂模式将对象的创建拖后到子类中创建,工厂类不在负责所有产品的创建,只是给出具体工厂必须实现的接口,这样工厂方法模式可以允许系统不修改工厂类逻辑情况下来添加新产品(只要添加具体工厂子类即可)。
工厂模式让工厂类和产品类具有平行的等级结构,从而解耦。
- 2、适用性
- 当一个类不知道它必须创建的类的时候。
- 当一个类希望由他的子类来指定所创建对象的时候
- 当类将创建对象的职责委托给多个帮助子类中某一个,并且希望将哪一个帮助子类是代理这这一信息局部化的时候
- 3、设计图
在客户程序中,我们有效地避免了具体产品对象和应用程序之间的耦合,可是我们也看到,增加了具体工厂对象和应用程序之间的耦合。那这样究竟带来什么好处呢?我们知道,在应用程序中,food对象的创建是频繁的,在这里我们可以把
foodFactory factory = new MilkFactory();
这句话放在一个类模块中,任何需要用到food对象的地方仍然不变。要是换一种日志记录方式,只要修改一处为:
foodFactory factory = new BreadFactory();
其余的任何地方我们都不需要去修改。有人会说那还是修改代码,其实在开发中我们很难避免修改,但是我们可以尽量做到只修改一处。
其实利用.NET的特性,我们可以避免这种不必要的修改。下面我们利用.NET中的反射机制来进一步修改我们的程序,这时就要用到配置文件了,如果我们想使用哪一种日志记录方式,则在相应的配置文件中设置如下:
1<appSettings>
2 <add key="factoryName" value="MilkFactory"></add>
3</appSettings>
4
此时客户端代码如下:
public static void Main(string[] args)
{
string strfactoryName = ConfigurationSettings.AppSettings["factoryName"];
FoodFactory factory;
factory = (LogFactory)Assembly.Load("CreateFood").CreateInstance("CreateFood." + strfactoryName);
Food food = factory.CreateFood();
}
三、综述
Factory Method模式是设计模式中应用最为广泛的模式,通过本文,相信读者已经对它有了一定的认识。然而我们要明确的是:在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。Factory Method要解决的就是对象的创建时机问题,它提供了一种扩展的策略,很好地符合了开放封闭原则