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

结构:

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

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

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

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

#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. Android 控件属性

    TextView 文字属性//文字左右居中android:layout_centerHorizontal="true"//文字垂直居中android:layout_centerVe ...

  2. python学习day1

    python简单介绍: Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种 ...

  3. AprioriTID algorithm

    What is AprioriTID? AprioriTID is an algorithm for discovering frequent itemsets (groups of items ap ...

  4. linux中的strings命令简介

    摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 在linux下搞软件开发的朋友, 几乎没有不知道 ...

  5. OC基础3:一些基本概念

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于NSLog函数中的“%2i”: ( ...

  6. c#中 HttpContext作用(一)【转】

    HttpContext 主要作用是要获得你客户端向服务端请求提交的相关信息  HttpContext 类:封装有关个别 HTTP 请求的所有 HTTP  特定的信息.也有人叫上下文信息. 1.生存周期 ...

  7. 【数学水题】【TOJ4113】【 Determine X】

    题目大意: yuebai has a long sequence of integers A1,A2,-,AN. He also has such a function: F(x)=∑i=1N(⌊Ai ...

  8. 实现DataGridView和DevExpress.GridControl表头全选功能

    1)DevExpress控件的GridView的实现多选操作 先讲DevExpress控件的GridView的实现,要实现的功能基本上是处理单击全选操作.重新绘制表头等操作,首先在加载第一步实现相关的 ...

  9. Excel 用row()函数 在Excel中自动添加序号,

    1.如图 2.用if条件根据产品名称判断是否有值进而序号自动添加 If(G9="","",Row()-8)

  10. VS2013关于“当前不会命中断点源代码与原始版本不同”的BUG

    文件明明没有动过,竟然一直给我这种提示! 解决方法:将出问题的文件用notepad打开,然后另存为Unicode编码,覆盖原来的文件. 网上另外有一种办法是:通过重新格式化出问题的源文件亦可以解决,即 ...