抽象工厂模式:

提供了一个创建一系列相关的或相互依赖的对象的接口而不须要详细指定它们的类型。

Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

UML类图:

主要包含:

  1. AbstractFactory(ContinentFactory):抽象的工厂类。为详细的工厂类声明了一系列的接口。
  2. ConcreteFactory(AfricaFactory,AmericaFactory):详细的工厂类。实现了创建详细对象的接口。
  3. AbstractProduct(Herbivore,Carnivore):抽象的产品类。

  4. Product(Wildebeest,Lion,Bison,Wolf):详细的产品类
  5. Client(AnimalWorld):使用抽象的工厂和抽象的产品类来创建对象。

主要的抽象工厂模式C++代码例如以下:

#include <iostream>
#include <stdlib.h>
#include <stdio.h> class AbstractProductA
{
public:
virtual void show()=0;
}; class ProductA1:public AbstractProductA
{
public:
void show()
{
std::cout<<"ProductA1::show()"<<std::endl;
} }; class ProductA2:public AbstractProductA
{
public:
void show()
{
std::cout<<"ProductA2::show()"<<std::endl;
}
}; class AbstractProductB
{
public :
virtual void display()=0;
}; class ProductB1:public AbstractProductB
{
public:
void display()
{
std::cout<<"ProductB1::display()"<<std::endl;
}
}; class ProductB2:public AbstractProductB
{
public:
void display()
{
std::cout<<"ProductB2::display()"<<std::endl;
}
}; class AbstractFactory
{
public:
virtual AbstractProductA* createProductA()=0;
virtual AbstractProductB* createProductB()=0; }; class ConcreteFactory1:public AbstractFactory
{
public:
AbstractProductA *createProductA()
{
return new ProductA1();
}
AbstractProductB *createProductB()
{
return new ProductB1();
}
}; class ConcreteFactory2:public AbstractFactory
{
public:
AbstractProductA *createProductA()
{
return new ProductA2();
}
AbstractProductB *createProductB()
{
return new ProductB2();
}
}; class Client
{
public: Client()
{
}
Client(AbstractFactory *af)
{
abstractFactory=af;
}
AbstractProductA * getProductA()
{
return abstractProductA;
}
AbstractProductB* getProductB()
{
return abstractProductB;
} void run()
{
abstractProductA=abstractFactory->createProductA();
abstractProductB=abstractFactory->createProductB();
}
~Client()
{
if(!abstractProductA)
delete abstractProductA;
if(!abstractProductB)
delete abstractProductB;
} private:
AbstractFactory *abstractFactory;
AbstractProductA * abstractProductA;
AbstractProductB * abstractProductB;
}; int main()
{
std::cout<<"抽象工厂模式測试"<<std::endl;
AbstractFactory *af=new ConcreteFactory1();
Client* client=new Client(af); client->run();
client->getProductA()->show();
client->getProductB()->display(); delete af;
delete client;
return 0;
}

运行结果:

再看一个详细的样例:

  1. AbstractFactor为ContinentFactory,即大陆工厂。

  2. ConcreteFactory为AfricaFactory(非洲大陆),AmericaFacoty(美洲大陆)
  3. AbstractProduct包含Herbivore(食草动物)。Carnivore(食肉动物)。
  4. Product包含Wildebeest(羚羊),Lison(狮子)。Bison(美洲野牛),Wolf(美洲狐狸)。
  5. Client为AnimalWorld。

大陆上有食肉动物和食草动物,可是不同的大陆比方说非洲大陆的食肉动物和食草动物和美洲大陆的食肉动物和食草动物是不同的。抽象工厂工厂模式和工厂方法模式的不同点就在于抽象工厂模式有两处变化的地方,除了工厂类能够变化外,抽象的产品类有多个而不是一个。

UML图例如以下:

C++代码实现例如以下:

#include <stdlib.h>
#include <stdio.h>
#include <iostream> //食草动物
class Herbivore
{
public:
virtual void drink()=0;
}; //羚羊的一种。产于非洲
class Wildebeest:public Herbivore
{
public:
void drink()
{
std::cout<<"wildbeest drink"<<std::endl;
}
}; //美洲野牛
class Bison:public Herbivore
{
public:
void drink()
{
std::cout<<"bison drink"<<std::endl;
}
}; //食肉动物
class Carnivore
{
public:
virtual void eat()=0;
}; //非洲狮子
class Lion:public Carnivore
{
public:
void eat()
{
std::cout<<"lion eat"<<std::endl;
}
}; //狼
class Wolf:public Carnivore
{
public:
void eat()
{
std::cout<<"wolf eat"<<std::endl;
}
}; //大陆工厂
class ContinentFactory
{
public:
virtual Herbivore * createHerbivore()=0;
virtual Carnivore * createCarnivore()=0; }; class AfricaFactory :public ContinentFactory
{
public:
virtual Herbivore * createHerbivore()
{
return new Wildebeest();
}
virtual Carnivore * createCarnivore()
{
return new Lion();
} }; class AmericaFactory :public ContinentFactory
{
public:
virtual Herbivore * createHerbivore()
{
return new Bison();
}
virtual Carnivore * createCarnivore()
{
return new Wolf();
} }; class AnimalWorld
{
public:
AnimalWorld()
{ }
AnimalWorld(ContinentFactory *cf)
{
herbivore=cf->createHerbivore();
carnivore=cf->createCarnivore(); }
void action()
{
herbivore->drink();
carnivore->eat();
}
~AnimalWorld()
{
if(!herbivore)
delete herbivore;
if(!carnivore)
delete carnivore;
}
private:
Herbivore * herbivore;
Carnivore * carnivore; }; int main()
{
std::cout<<"抽象工厂模式详细的样例"<<std::endl;
ContinentFactory * cf=new AmericaFactory;
AnimalWorld *an=new AnimalWorld(cf);
an->action();
delete cf;
delete an;
return 0;
}

运行结果:

设计模式之十一:抽象工厂模式(Abstract Factory)的更多相关文章

  1. 设计模式学习心得<抽象工厂模式 Abstract Factory>

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

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

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

  3. IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  4. 《JAVA设计模式》之抽象工厂模式(Abstract Factory)

    场景问题 举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如CPU.硬盘.内存.主板.电源.机箱等.为讨论使用简单点,只考虑选择CPU和主板的问题. 事实上,在选择 ...

  5. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  6. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

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

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

  8. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  9. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  10. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

随机推荐

  1. UML笔记(3):顺序图、Sequence Diagram

    http://www.cnblogs.com/xueyuangudiao/archive/2011/09/22/2185364.html 目录 含义 要素: 1 活动者 2 对象 3 生命线 4 控制 ...

  2. 兼容ie7到ie11,edge,chrome,firefox的ajax发送接收post数据代码

    /* * 生成XMLHttpRequest */ function getxhr() { //获取ajax对象 var xhr = null; try { xhr = new XDomainReque ...

  3. python接口自动化3-自动发帖(session)【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python%E6%8E%A5%E5%8F%A3%E8%87%AA%E5%8A%A8%E ...

  4. C3P0连接池工具类使用

    c3p0的基本连接配置文件 c3p0-config.xml <c3p0-config> <default-config> <property name="dri ...

  5. shell中各种美元符号组合

    $ 这个程式的执行名字 $n 这个程式的第n个参数值,n=.. $* 这个程式的所有参数,此选项参数可超过9个. $# 这个程式的参数个数 $$ 这个程式的PID(脚本运行的当前进程ID号) $! 执 ...

  6. VirtualBox虚拟机安装CentOS 7

    新建虚拟机 因为比较简单,所以对于VirtualBox就不做过多介绍了,直接下载安装即可,安装好之后打开Oracle VM VirtualBox管理器,点击新建,选择Red Hat(根据windows ...

  7. 开发API完成,写个文档

    Jira对接Prism开发API指南 部门 证系统运维团队 文档制作人 陈刚() 时间 2017-04-05 版本 第一版 目录 目的... 1 通例:... 1 认证... 2 新建版本单... 2 ...

  8. Netty源码学习(二)NioEventLoopGroup

    0. NioEventLoopGroup简介 NioEventLoopGroup可以理解为一个线程池,内部维护了一组线程,每个线程负责处理多个Channel上的事件,而一个Channel只对应于一个线 ...

  9. (2)新概念英语一(1-10)lessons

    一共105个单词 lesson1 lesson2 lesson3 lesson4 lesson5 lesson6 lesson7 lesson8 lesson9 lesson10

  10. Good Bye 2016 A. New Year and Hurry【贪心/做题目每道题花费时间按步长为5等差增长,求剩余时间够做几道题】

    A. New Year and Hurry time limit per test 1 second memory limit per test 256 megabytes input standar ...