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

结构:

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

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

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

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

#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. C#实现在winfrom程序中下载文件

    //下载文件//downlaodUrl 系统路径如:http://xxx.xxx.xxx/UpFile/kaoqin.doc//fileName 自定义文件名字加后缀(如:考勤.doc)//fileP ...

  2. logstash grok正则调试

    logstash 正则调试: nginx 配置: log_format main '$remote_addr [$time_local] "$request" '; logstas ...

  3. 函数dirname--返回路径中的目录部分

    http://blog.chinaunix.net/uid-122937-id-142880.html dirname() 函数作用   返回路径中的目录部分. 语法   dirname(path) ...

  4. fseek/ftell/rewind/fgetpos/fsetpos函数使用-linux

    程序: #include<stdio.h> int main(int argc,char *argv[]) { FILE * stream; fpos_t pos; stream = fo ...

  5. JqueryUI-1

    本文在于巩固基础 学习网址:http://jqueryui.com/ 基本概念:jQuery UI[是以 jQuery 为基础的开源 JavaScript 网页用户界面代码库.包含底层用户交互.动画. ...

  6. js的事件属性方法一览表

    event对象常用属性和方法 event 对象用来表示当前事件,事件有很多状态,例如,鼠标单击时的位置,按下键盘时的按键,发生事件的HTML元素,是否执行默认动作,是否冒泡等,这些都是作为event对 ...

  7. UVA 1312 Cricket Field

    题意: 在w*h的坐标上给n个点, 然后求一个最大的矩形,使得这个矩形内(不包括边界)没有点,注意边界上是可以有点的. 分析: 把坐标离散化.通过两重循环求矩形的高,然后枚举,看是否能找到对应的矩形. ...

  8. ListView及Adapter的使用

    一.使用ArrayAdapter 其中ArrayAdapter的构造函数有如下几个,其中resource是指每个列表项的布局文件,objects是指列表项的数据源,此处通常指一个数组 ArrayAda ...

  9. xcode新建项目介绍

    xcode新建项目介绍 1.打开xcode选择“create a new xcode project 2.product name 工程名称 campany identifter 公司id 一般都写公 ...

  10. Python同步数据库的数据到Neo4J

    写了主要是步骤,如果疑问,请咨询QQ:5988628 Python版本采用2.7.X,默认的2.6.X后期会有问题,建议,一开始就升级Python.然后再安装pip. 访问数据库 sqlalchemy ...