简单工厂模式和工厂模式 要求 同类型的产品子类有共同的方法。这限制了产品子类的扩展。抽象工厂能client它提供了一个接口,它是client而不必指定产品的详细信息。创建多个产品系列产品对象。在归为一类相同的子类的产品抽象工厂类。让他们继承相同的抽象子类。子类视为一组。产品族是指位于不同产品等级结构中,功能相关联的产品组成的家族。

一般位于不同等级结构的同样位置上。每个产品族中的产品数量与产品等级结构的数量同样。用户通过工厂以及族来推断

当用户使用时,必须知道哪个工厂以及哪个产品族的产品类,即通过组和族的二维坐标来确定详细的产品子类。每一个工厂子类负责一族产品。且有一个方法来生成一种类型的产品。

举个样例说明。对于抽象工厂基类AbstractFactory派生了 3个详细的工厂类Factory1,Factory2,Factory3。则族数为3。即每一个抽象产品类有3个详细子类。

若有 2 个抽象产品类AbstractProductA,AbstractProductB。即2个组,则工厂类中有2个创建对象的函数createProductA,createProductB。

简单的实现:

class AbstractProductA{
public:
virtual void fun() = 0;
AbstractProductA(){}
virtual ~AbstractProductA(){} };
class ProductA_1 : public AbstractProductA{
public:
virtual void fun(){cout<< "A_1"<<endl;}
ProductA_1(){}
virtual ~ProductA_1(){}
};
class ProductA_2 : public AbstractProductA{
public:
virtual void fun(){cout<< "A_2"<<endl;}
ProductA_2(){}
virtual ~ProductA_2(){}
};
class ProductA_3 : public AbstractProductA{
public:
virtual void fun(){cout<< "A_3"<<endl;}
ProductA_3(){}
virtual ~ProductA_3(){}
}; //B组
class AbstractProductB{
public:
virtual void fun() = 0;
AbstractProductB(){}
virtual ~AbstractProductB(){} };
class ProductB_1 : public AbstractProductB{
public:
virtual void fun(){cout<< "B_1"<<endl;}
ProductB_1(){}
virtual ~ProductB_1(){}
};
class ProductB_2 : public AbstractProductB{
public:
virtual void fun(){cout<< "B_2"<<endl;}
ProductB_2(){}
virtual ~ProductB_2(){}
};
class ProductB_3 : public AbstractProductB{
public:
virtual void fun(){cout<< "B_3"<<endl;}
ProductB_3(){}
virtual ~ProductB_3(){}
}; class AbstractFactory{
public:
AbstractFactory(){};
virtual ~AbstractFactory();
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
};
class Factory1:public AbstractFactory{
public:
Factory1(){}
~Factory1(){}
AbstractProductA* createProductA(){return new ProductA_1();}
AbstractProductB* createProductB(){return new ProductB_1();}
};
class Factory2:public AbstractFactory{
public:
Factory2(){}
~Factory2(){}
AbstractProductA* createProductA(){return new ProductA_2();}
AbstractProductB* createProductB(){return new ProductB_2();}
};
class Factory3:public AbstractFactory{
public:
Factory3(){}
~Factory3(){}
AbstractProductA* createProductA(){return new ProductA_3();}
AbstractProductB* createProductB(){return new ProductB_3();}
};

抽象工厂的用处。其原始意义是为了UNIX 和Windows,两者很多操作是同样的,这些同样的对象如File。Button等,这些东西分别为Windows族和Unix族各有一份,而对File这样对象的工厂类称Unixfile和Windowsfile为一组,进行结构化的划分。

抽象工厂支持不同类型的产品。更加方便的使用同一族中间的不同类型的产品。添加一族产品时。不改动工厂类和产品类的接口。不违背开闭原则。

缺点:结构过于臃肿。即使我仅仅是简单实现,而3x2,就写了以上如此多的代码。假设产品组数变多或族数添加,都会使其难以管理。

每加入产品的第二组,工厂类和产品类接口必须改变,相反,开闭原则。

版权声明:本文博主原创文章,博客,未经同意不得转载。

设计模式C++达到 3.抽象工厂的更多相关文章

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

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

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

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

  3. 设计模式的征途—3.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  4. 设计模式(3)抽象工厂模式(Abstract Factory)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂 ...

  5. Java设计模式(二)抽象工厂模式

    一.场景描述 接<Java设计模式(一)工厂模式>https://www.cnblogs.com/mahongbiao/p/8618970.html 工厂模式有一缺点,就是破坏了类的封闭性 ...

  6. 设计模式的征途—4.抽象工厂(Abstract Factory)模式

    上一篇的工厂方法模式引入了工厂等级结构,解决了在原来简单工厂模式中工厂类职责太重的原则,但是由于工厂方法模式的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,从而增加系统开销.那么,我们应该 ...

  7. &lt;十一&gt;读&lt;&lt;大话设计模式&gt;&gt;之抽象工厂模式

    学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难.就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便.抽象工厂模式名字听起来抽象.但理解起来一点也不抽象,用语言 ...

  8. java设计模式 -------- 创建模式 之 抽象工厂模式

    本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...

  9. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  10. 设计模式课程 设计模式精讲 6-2 抽象工厂coding

    1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...

随机推荐

  1. How do I create a zip file?(转)

    Creating a zip file is a task that can easily be accomplished by using the classes ZipOutputStream a ...

  2. 《转》 Openstack Grizzly 指定 compute node 创建 instance

    声明:此文档仅仅做学习交流使用,请勿用作其它商业用途 作者:朝阳_tony 邮箱:linzhaolover@gmail.com 2013年6月4日9:37:44 星期二 转载请注明出处:http:// ...

  3. MySQL HINT:Straight_JOIN

    来自生产环境的朋友.可能都会碰到:          原本运行良好的查询语句,过了一段时间后,可能会突然变得很糟糕     一个很大可能的原因就是数据分布情况发生了变化     从而导致MySQL优化 ...

  4. win32收不到F10按键消息解决办法

    在WM_KEYDOWN中处理F10(VK_F10)消息总是获取不到,后来用spy++监听窗口消息发现按下F10并没有WM_KEYDOWN消息产生,而是产生了WM_SYSKEYDOWN http://b ...

  5. POJ 3696 神TM数论

    鸣谢: http://blog.csdn.net/yhrun/article/details/6908470 http://blog.sina.com.cn/s/blog_6a46cc3f0100tv ...

  6. hdu 3832 Earth Hour (最短路变形)

    Earth Hour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Tota ...

  7. Java Web----Java Web的数据库操作(二)

    Java Web的数据库操作 三.JDBC操作数据库 上一篇介绍了JDBC API,之后就可以通过API来操作数据库,实现对数据库的CRUD操作了. http://blog.csdn.net/zhai ...

  8. graph driver-device mapper-02driver基本操作

    // 清除thin pool 1.1 func (d *Driver) Cleanup() error { // 停止thin pool err := d.DeviceSet.Shutdown() r ...

  9. Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration

    Installing and setting up Oracle GoldenGate connecting to an Oracle database Also please make sure t ...

  10. PS CC 2014 把一个图层输出为文件的方法

    近期在设计一个Qt控件,须要获得一个圆饼的图片,在用PS绘制后发现保存的时候总是会带着背景,用PNG格式保存之后背景依旧存在.仅仅是变成了透明的.刚才在Google上查到了仅仅保存单一图层而全然没有背 ...