Factroy 简单工厂

意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。

动机

框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。框架必须实例化类,但是它只知道不能被实例化的抽象类。

适用性

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

结构

参与者

Product:定义工厂方法所创建的对象的接口

ConcreteProduct:实现Product接口

Creator:声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcretePruduct实例

ConcreteCreator:重定义工厂方法以返回一个ConcreteProduct实例

协作

Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例

实现

主要有两种不同的情况:
1)第一种情况是,Creator类是一个抽象类并且不提供它所声明的工厂方法的实现。
2)第二种情况是,Creator是一个具体的类而且为工厂方法提供一个缺省的实现。

//MyProduct和YourProduct是Product的子类
class Creator
{
public:
    virtual Proruct * Create(PruductId);
};

Product * Creator::Create(ProductId id)
{
    if (id == MINE) return new MyProduct;
    if (id == YOURS) return new YourProduct;

    return 0;
}

 

子类MyCreator可以减缓MyProduct和YourProduct并且支持一个新的子类TheirProduct;最后返回父类的Create是它对其它类不感兴趣,交给父类Create处理:

Product * MyCreator::Create(ProductId id)
{
    if (id == MINE) return new MyProduct;
    if (id == YOURS) return new YourProduct;
    if (id == THEIRS) return new TheirProduct;

    return Creator::Create(id);
}

 

posted on 2016-07-14 10:58  已停更  阅读(361)  评论(0编辑  收藏  举报