简单工厂模式、工厂方法和抽象工厂三种模式的名称都共有“工厂”两字。而且这三种模式既有相似之处,也有各自特点。所以我将这三个模式一起学习。
6简单工厂模式
6.1 概述
6.1.1 意图
简单工厂的作用事实例化对象,而不需要客户了解对象属于哪个具体的子类。
6.1.2 使用场合
简单工厂实例化的类具有相同的接口,子类有限并且基本上不需要扩展时,可以使用简单工厂。(这里描述的是传统的实现方式,在.NET开发环境中可以采用反射的方法简化其实现,这将在稍后进行学习)
6.1.3 效果
采用简单工厂的优点是可以使用户根据参数获得对应得的类实例,避免了直接实例化类,降低了耦合性。缺点是可实例化的类型在编译时已经被确定,如果新增加类型,则需要修改工厂。
简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。
6.2 .NET实现
6.2.1 实现要点
*通常简单工厂不需要实例化,而是采用静态方法。
*抽象类和接口都可以实现对具体类的抽象。如果要被实例化的子类有大量的代码,则可以考虑抽象类,这样可以减少代码的重复。然而这样做的缺点是扩展性不好,子类之间存在潜在的耦合性。因此通常的情况下可以考虑采用接口代替抽象类,具体类通过实现接口可以获得同样的效果。
6.2.2 结构
6.2.3 代码框架
6.3.3简单工厂的综合应用
最常见的就是应用程序通过读取配置文件(web.config或app.config)中的数据库类型信息实例化对应的数据库访问类。当采用的数据库类型变化时,只需要提供相应的数据库访问类。并且修改配置文件中的参数就行了,无需修改原程序。
6.3.4 相关模式
简单工厂并不包含在GOF的23种设计模式中,而是被归为工厂方法的一种形式,使参数华的工厂方法。
7 工厂方法模式
引言
工厂方法是粒度很小的设计模式,因为模式的表象只是一个抽象的方法。工厂方法经常用于创建与某个类相关的类的实例,.NET中的数据库连接对象就是产生数据库命令对象的工厂,其中的CreateCommand方法就是工厂方法。
在IDbConnection中定义了产生IDbCommand对象的工厂方法CreateCommand,具体的Command对象由具体 的Connection对象创建。它与具体的数据库相关,不同数据库创建不同类型的Command对象。
IDbConnection定义了CreateCommand的接口:
IDbConnection CreateCommand();
具体的Connection类中定义了对应得实现。
7.1 意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类,这个接口所指的就是一个抽象方法。该方法说明需要创建一个对象,但并不给具体的创建方法和创建什么类型的对象。
7.2 使用场合
当一个类不知道它所必需创建对象的类或一个类希望由子类来指定他所创建的对象时可以使用工厂方法。
7.3 结构
namespace CShapreCreator
{
public abstract class Creator
{
public abstract Production FactoryMathod();
}
public class ConcreteCreator: Creator
{
public override Production FactoryMathod()
{
return new ConcreteProduction();
}
}
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlock%