C++设计模式-工厂方法

转载 2011年01月21日 18:01:00
定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法(Factory Method)使一个类的实例化延迟到其子类。也叫虚构造器(Virtual Constructor
 
结构
工厂方法
 
理解
1.       Product是工厂方法生产产品的抽象基类。
2.       Creator是生产产品的工厂对象抽象基类。Creator提供创建虚方法即工厂方法FactoryMeothod()FactoryMeothod()由派生类(ConcreteCreator)具体实现,生产对应的具体产品(ConcreteProduct)。
3.       ConcreteProduct是继承Product的具体产品。
4.       ConcreteCreator是生产对应具体产品(ConcreteProduct)的具体工厂。它重新实现继承的工厂方法FactoryMeothod(),生产具体产品。
 
要点
1.       工厂方法模式中,工厂和产品的基类和派生类是平行关系。抽象产品(Product)对应层次是抽象工厂(Creator)。在派生类层次,每个具体产品(ConcreteProduct)对应一个具体工厂(ConcreteCreator)。换句话说,每新增一个具体产品,就要新增一个对应的具体工厂
2.       工厂方法的核心是FactoryMeothod(),每个具体工厂都重新实现该接口,产生具体类对象。
3.       工厂方法分离客户端和具体类的实现。利用子类(即具体工厂),让子类来决定如何来生产一个具体产品。这样,客户端(即调用者)只需要知道这个类的抽象类型,由子类去和具体产品类打交道。
4.       工厂基类中的方法AnOperation(),不是工厂方法,只是供具体工厂实现的公共接口(可以说是工厂对产品的使用行为)。但个人认为,工厂方法只是生产产品,公共接口的重点应该是产品,因此在产品基类里增加产品使用的公共接口更加实用。
5.       工厂方法模式的工厂(Creator)若要全局唯一,可以结合单件(Singleton)模式应用。
6.       关于简单工厂(也叫静态工厂)。工厂方法强调的是“让子类决定实例化什么样的对象”,因为子类知道它们要使用的特定产品。如果我们将CreatorConcreteCreator的角色合一,并且将工厂方法FactoryMeothod()静态化,那么就退化成了简单工厂模式。
 
应用
1.       工厂方法应用场景:
当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。(往往放在抽象产品侧)
2.       Loki库中对工厂方法有一个比较完美的实现,结合了函数对象(Functor),可制定产品创建方法。可参见:http://loki-lib.sourceforge.net/index.php?n=Pattern.FactoryMethod
3.       源码中的应用
COSProduct是产品基类。并且有产品的公共使用接口。
COSCreator是工厂基类。模式结构中的产品使用行为接口AnOperaion并没有出现在工厂基类接口中,放在了产品侧(Start接口)。
具体工厂可以通过继承COSCreator实现,有多少个具体工厂,就要有多少个具体工厂类。通过C++模板可以避免创建多个具体工厂(模板类CConcreteCreator)。
 
源码
#include <iostream>
#include <string>
using namespace std;
 
///////////////////产品
class COSProduct
{
public:
    virtual ~COSProduct(){};
    //产品的公共接口。相当于AnOperation
    virtual void Start() = 0;
};
 
class CWindowsProduct : public COSProduct
{
public:
    virtual void Start()
    {
        cout << "Windows start." << endl;
    }
};
 
class CLinuxProduct : public COSProduct
{
public:
    virtual void Start()
    {
        cout << "Linux start." << endl;
    }
};
 
///////////////////工厂基类
class COSCreator
{
public:
    ~COSCreator(){};
    //工厂方法。生产产品
    virtual COSProduct* Create() = 0;
};
 
///////////////////具体工厂
class CWindowsCreator : public COSCreator
{
public:
    virtual COSProduct* Create()
    {
        cout << "Create windows…" << endl;
        return new CWindowsProduct;
    };
};
class CLinuxCreator : public COSCreator
{
public:
    virtual COSProduct* Create()
    {
        cout << "Create linux…" << endl;
        return new CLinuxProduct;
    };
};
 
/////另一种具体工厂:使用模板避免创建多个具体工厂子类
template<typename T>
class CConcreteCreator : public COSCreator
{
public:
    CConcreteCreator(const string strProductType) : m_strProductType(strProductType)
    {};
 
    virtual COSProduct* Create()
    {
        cout << "ConcreteCreator. product type: " << m_strProductType << endl;
        return new T;
    };
 
protected:
    string m_strProductType;
};
 
 
int main()
{
    COSCreator* pCreator = NULL;
    COSProduct *pProduct = NULL;
 
    pCreator = new CWindowsCreator;
    pProduct = pCreator->Create();
    pProduct->Start();
    delete pProduct;
    delete pCreator;
 
    pCreator = new CLinuxCreator;
    pProduct = pCreator->Create();
    pProduct->Start();
    delete pProduct;
    delete pCreator;
 
    //另一种实现具体工厂方式:使用模板避免创建子类
    CConcreteCreator<CWindowsProduct> windowsCreator("windows");
    pProduct = windowsCreator.Create();
    pProduct->Start();
    delete pProduct;
 
    CConcreteCreator<CLinuxProduct> linuxCreator("linux");
    pProduct = linuxCreator.Create();
    pProduct->Start();
    delete pProduct;
 
    system("pause");
    return 0;
}
 
输出:
Create windows…
Windows start.
Create linux…
Linux start.
ConcreteCreator. product type: windows
Windows start.
ConcreteCreator. product type: linux
Linux start.
 

设计模式【工厂方法模式】

本文主要是分享自己在学习设计模式过程中的心得与记录,有什么不当之处,望各位有心关注的看官,给予指证与说明。本文主要讲述【工厂方法模式】,望各位细细品读。【转载使用,请注明出处:http://blog....
  • ma_hoking
  • ma_hoking
  • 2014年09月23日 22:34
  • 1221

大话设计模式C++实现-第8章-工厂方法模式

一、UML图 二、包含的角色 (1)抽象工厂 (2)具体工厂 (3)抽象产品 (4)具体产品 三、优势 (1)工厂方法模式是对简单工厂模式的稍微的改进。工厂方法模式的用意是定义一个创建产品对象的工...
  • XD_lixin
  • XD_lixin
  • 2014年11月09日 22:26
  • 1836

设计模式之简单工厂,工厂方法模式(c++)

问题描述 在面向对象系统设计中经常可以遇到以下的两类问题: 1)为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可...
  • u012219045
  • u012219045
  • 2017年03月05日 15:01
  • 434

使用Object-C实现23种设计模式之工厂方法模式

23种设计模式的OC实现,23种设计模式之工厂方法模式。
  • u013054715
  • u013054715
  • 2016年05月19日 11:50
  • 4536

Scala设计模式Part I. 创建模式——3.工厂方法

描述 工厂方法的意图是: 定义一个对象创建接口,但是让子类决定实例化哪个类。工厂方法让类的实例化延迟到子类。 工厂方法通常用于实例化时无法确定其类型的情况。GOF中以一个应用程序框架为例。抽...
  • xxfigo
  • xxfigo
  • 2016年05月25日 23:21
  • 1001

C++设计模式之工厂方法模式(Factory Method)

工厂方法模式 1.意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。又叫虚拟构造子(Virtual Constructor)模...
  • hahaha777527
  • hahaha777527
  • 2016年03月23日 18:42
  • 1175

C#面向对象设计模式纵横谈(5): Factory Method 工厂方法(创建型)

讲师:李建忠从耦合关系谈起– 模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改– 模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其他模块保持不变耦合关系直接...
  • onlyxuyang
  • onlyxuyang
  • 2006年04月27日 12:48
  • 823

工厂方法模式(Factory Method)-最易懂的设计模式解析

前言在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭...
  • carson_ho
  • carson_ho
  • 2016年08月28日 08:31
  • 3679

scala实现设计模式之简单工厂模式

package com.linewell.modeldesgin.simplefactory /** * Created by ctao on 2015/8/6. * 抽象产品类,抽象图表特质,...
  • cjuexuan
  • cjuexuan
  • 2015年08月06日 20:37
  • 807

Swift设计模式之工厂方法模式

转自 Swift设计模式 原文 Design-Patterns-In-Swift // 工厂方法模式 // 百度百科:是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性...
  • aotian16
  • aotian16
  • 2016年05月12日 11:38
  • 1413
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++设计模式-工厂方法
举报原因:
原因补充:

(最多只允许输入30个字)