简单工厂模式和工厂模式 要求 同类型的产品子类有共同的方法。这限制了产品子类的扩展。抽象工厂能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. AJAX入门---DOM操作HTML

    AJAX入门---DOM操作HTML 一边学习AJAX一边坐着总结加深印象.上次写的是怎样简单的使用XMLHttpRequest对象.今天写的是DOM(文档对象模型(Document Object M ...

  2. hdu 4715 Difference Between Primes 2013年ICPC热身赛A题 素数水题

    题意:给出一个偶数(不论正负),求出两个素数a,b,能够满足 a-b=x,素数在1e6以内. 只要用筛选法打出素数表,枚举查询下就行了. 我用set储存素数,然后遍历set里面的元素,查询+x后是否还 ...

  3. MVP模式在Android开发中的应用

    一.MVP介绍      随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互.同一 ...

  4. Qt 向word中插入文字(使用QAxWidget和QAxObject)

    pro 文件中要加入 CONFIG += qaxcontainer 2. main.cpp #include <QApplication> #include <QAxWidget&g ...

  5. 14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读

    14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读 一致性读 意味着 InnoDB 使用多版本来保护查询一个数据库在当前时间点的快照. 查询看到被事务做出的修改, ...

  6. UVA 534 - Frogger(kruskal扩展)

    UVA 534 - Frogger 题目链接 题意:给定一些点.如今要求一条路径从第一个点能跳到第二个点,而且这个路径上的最大距离是最小的 思路:利用kruskal算法,每次加最小权值的边进去,推断一 ...

  7. linux 查看某进程或程序的网卡流量(转)

    一.nethogs介绍 分享一个linux 下检测系统进程占用带宽情况的检查.来自github上的开源工具. 它不依赖内核中的模块.当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个 ...

  8. 区间Dp 暴力枚举+动态规划 Hdu1081

    F - 最大子矩形 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Des ...

  9. Android ARM汇编语言

    简介 ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集. 原生程序与ARM汇编语 ...

  10. Map实现之HashMap(结构及原理)(转)

    java.util包中的集合类包含 Java 中某些最常用的类.最常用的集合类是 List 和 Map.List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构 ...