与工厂方法模式的区别是工厂子类中会创建出同一类型的不同产品对象。工厂方法模式则工厂子类中只是创建一种具体的产品对象

结构:

产品基类:子类继承的虚函数方法

具体产品子类:实现该产品功能

工厂基类:工厂子类中存在的抽象方法,即子类中创建对象的抽象方法必须在此类中

工厂子类:有多个创建产品的对象的方法,每一个方法负责创建一个具体产品的对象,这些产品都是属于同一类型即同一组件的产品

#include <iostream>
#include <string>
using namespace std;
 
/////////////产品
class CLinux
{
public:
    virtual ~CLinux() {};
    //产品使用公共接口
    virtual void Start() = 0;
};
 
class CLinuxMobile : public CLinux
{
public:
    CLinuxMobile()
    {
        cout << "create linux mobile." << endl;
    }
    virtual ~CLinuxMobile() {};
    virtual void Start()
    {
        cout << "linux mobile start." << endl;
    };
};
class CLinuxPC : public CLinux
{
public:
    CLinuxPC()
    {
        cout << "create linux PC." << endl;
    }
    virtual ~CLinuxPC() {};
    virtual void Start()
    {
        cout << "linux PC start." << endl;
    };
};
 
class CWindows
{
public:
    virtual ~CWindows() {};
    //产品使用公共接口
    virtual void Start() = 0;
};
 
class CWindowsMobile : public CWindows
{
public:
    CWindowsMobile()
    {
        cout << "create windows mobile." << endl;
    }
    virtual ~CWindowsMobile() {};
    virtual void Start()
    {
        cout << "windows mobile start." << endl;
    };
};
class CWindowsPC : public CWindows
{
public:
    CWindowsPC()
    {
        cout << "create windows PC." << endl;
    }
    virtual ~CWindowsPC() {};
    virtual void Start()
    {
        cout << "windows PC start." << endl;
    };
};
 
 
////工厂
class CFactory
{
public:
    virtual ~CFactory(){};
    //产品族有个产品组件
    virtual CLinux* CreateLinux() = 0;
    virtual CWindows* CreateWindows() = 0;
};
 
class CMobileFactory : public CFactory
{
public:
    CMobileFactory()
    {
        cout << "create mobile factory." << endl;
    }
    virtual ~CMobileFactory(){};
    virtual CLinux* CreateLinux()
    {
        return new CLinuxMobile;
    };
    virtual CWindows* CreateWindows()
    {
        return new CWindowsMobile;
   };
};
 
class CPCFactory : public CFactory
{
public:
    CPCFactory()
    {
        cout << "create PC factory." << endl;
    }
    virtual ~CPCFactory(){};
    virtual CLinux* CreateLinux()
    {
        return new CLinuxPC;
    };
    virtual CWindows* CreateWindows()
    {
        return new CWindowsPC;
    };
};
 
void Test(CFactory* pFactory)
{
    CLinux* pLinux = NULL;
    CWindows* pWindows = NULL;
 
    pLinux = pFactory->CreateLinux();
    pWindows = pFactory->CreateWindows();
    pLinux->Start();
    pWindows->Start();
    delete pWindows;
    delete pLinux;
};
 
int main()
{
    CFactory* pFactory = NULL;
 
    //手机工厂。生产手机产品族,种类有Linux和Windows
    pFactory = new CMobileFactory;
    Test(pFactory);
    delete pFactory;
    cout << endl;
 
    //PC工厂。生产PC产品族,种类有Linux和Windows
    pFactory= new CPCFactory;
    Test(pFactory);
    delete pFactory;
 
    system("pause");
    return 0;
}

抽象工厂模式firstones的更多相关文章

  1. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

    一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...

  2. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  3. Objective-C 工厂模式(下) -- 抽象工厂模式

    相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的 抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产 比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买 ...

  4. Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  5. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  6. 设计模式(四)抽象工厂模式(Abstract Factory Pattern)

    一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建 ...

  7. php实现设计模式之 抽象工厂模式

    <?php /*抽象工厂模式:提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类 * 创建型模式 */ //抽象小米工厂,能制造小米一,小米二 abstract class mi ...

  8. 设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

    定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往 ...

  9. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

随机推荐

  1. jquery hover延时

    var timer;    //绑定hover事件    $(function () {         $(".centercy img").hover(showPic, hid ...

  2. eclipsecpp从可执行程序员中导入源代码并调试

    如果寻找跨平台IDE及调试环境,那eclipse是最佳选择了,因为它有一项超强功能:可以从可执行程序员导入源代码并调试程序,这种特性是非常适合自定义MakeFile项目,不需要改变项目现有结果,即可自 ...

  3. 【the service mysql57 failed the most】

    异常信息: the the service mysql57 failed the most recent status change request with the messagethe servi ...

  4. Linux下的sudo及其配置文件/etc/sudoers的详细配置说明

    http://www.osedu.net/article/linux/2011-01-03/178.html Linux下的sudo及其配置文件/etc/sudoers的详细配置说明 1.sudo介绍 ...

  5. .NET与你若仅仅如初见(一)

    难忘初次见到你,那是一个夏日的午后,可是天空中乌云密布.大雨来临前的一段时间总是非常闷热的,当我朦胧的睡眼看到你之后瞬间就清醒了,感觉空气也凉爽了起来.尽管仅仅一眼但就是被你那清新脱俗沉鱼落雁之美所征 ...

  6. Android----获取activity上所有的控件

    /**          * @note 获取该activity所有view          * @author liuh          * */         public List< ...

  7. SSCTF-PWN

    前几天比赛的PWN题,简单写了下. PWN400 漏洞是一个数组越界访问造成的任意地址读写.在对数据排序后,对数据进行查询和更新时,可以访问到数组以外一个元素(4个字节). 程序中存在3种数据结构,第 ...

  8. VS2010中查询替换使用

    MSDN:http://msdn.microsoft.com/zh-cn/library/afy96z92.aspx 例子:

  9. 关于Apache+PHP+MySQL的安装

    除了在安装MySQL的时候花了三天的时间,也学习了如何看错误日志,如何看配置文件等, Apache+PHP的安装都比较顺利,主要是要按照一个文档来安装,不要东拼西凑, 个人认为这篇“百度经验”写得很好 ...

  10. ASP.NET DataList绑定数据并实现分页

    显示当前页码Label属性 值ID NowPageNumberLabtext    1 ×××××××××××××××××××××显示总页码Label属性 值ID BackPageNumberLabt ...