设计模式之十一:抽象工厂模式(Abstract Factory)
抽象工厂模式:
提供了一个创建一系列相关的或相互依赖的对象的接口而不须要详细指定它们的类型。
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
UML类图:
主要包含:
- AbstractFactory(ContinentFactory):抽象的工厂类。为详细的工厂类声明了一系列的接口。
- ConcreteFactory(AfricaFactory,AmericaFactory):详细的工厂类。实现了创建详细对象的接口。
- AbstractProduct(Herbivore,Carnivore):抽象的产品类。
- Product(Wildebeest,Lion,Bison,Wolf):详细的产品类
- 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;
}
运行结果:
再看一个详细的样例:
- AbstractFactor为ContinentFactory,即大陆工厂。
- ConcreteFactory为AfricaFactory(非洲大陆),AmericaFacoty(美洲大陆)
- AbstractProduct包含Herbivore(食草动物)。Carnivore(食肉动物)。
- Product包含Wildebeest(羚羊),Lison(狮子)。Bison(美洲野牛),Wolf(美洲狐狸)。
- 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)相关推荐
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)
[JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...
- 设计模式(20):创建型-抽象工厂模式(Abstract Factory)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 详解
抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916 ...
- 抽象工厂模式 Abstract Factory Pattern
源地址 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建 ...
- 抽象工厂模式-Abstract Factory Pattern
抽象工厂模式-Abstract Factory Pattern 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽 ...
- 设计模式之抽象工厂模式(Abstract Factory)摘录
面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)
一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...
最新文章
- jsf项目启动报:java.lang.ClassNotFoundException: javax.faces.webapp.FacesServlet
- 如何使盘ISO图像文件
- linux 用户权限详解,03_04_Linux用户及权限详解
- windows连接远程Hadoop/Spark
- 通过yum安装Nginx
- vmware centos7 扩展容量
- RuoYi-Cloud 部署篇_03(windows环境 mysql版本)
- Android平台RTMP推送端实现外部数据对接推送和录像
- 用 普通 用户欺骗登陆 获取 管理员的最高权限~~~~
- oracle怎样查询能利用索引,oracle怎样查询索引的使用情况
- 使用SQLite3存储和读取数据(转)
- win7如何配置java环境变量_Windows 7系统如何配置Java环境变量?
- socks5协议(rfc1928)
- Java具体可以做什么?
- 无法安装冰点还原_系统还原软件介绍与功能
- x86汇编游戏——2048
- 大榕树BASIS QQ群
- WebGL入门(三十九)-透明与不透明物体共存,绘制透明面和不透明面的立方体
- html5 相册翻转效果,HTML5 css3:3D旋转木马效果相册
- vue重复访问同一路由报错
热门文章
- FTP:文件传输协议(指令及响应代码)
- ROS(kinetic)报错:CMakeFiles/Makefile2:9038: recipe for target ‘XXX‘
- python调用PostgreSQL 11
- 【线性代数】2-5:逆(Inverse)
- C# 声明方法关键字
- TCP协议的一些认识及实践
- 让TortoiseGit记住帐号密码方法
- DeepNude已迅速下线,来看看它涉及的图像修复技术
- 来自朋友最近阿里、腾讯、美团等P7岗位面试题
- Spring中异步注解@Async的使用、原理及使用时可能导致的问题