创建型模式-抽象工厂模式(abstract_factory)
来源:互联网 发布:rf 910编程器驱动程序 编辑:程序博客网 时间:2024/05/29 08:14
抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
实例
main.cc:
#include "abstract_factory.h"#include "abstract_cooker.h"#include "abstract_washer.h"#include "haier_factory.h"#include "midea_factory.h"#include "windows.h"/*design_pattern:"abstract_factory"*/int main(){ AbstractFactory* haier_factory = new HaierFactory(); AbstractFactory* midea_factory = new MideaFactory(); AbstractCooker* haier_cooker = haier_factory->CreateCooker(); AbstractWasher* haier_washer = haier_factory->CreateWasher(); AbstractCooker* midea_cooker = midea_factory->CreateCooker(); AbstractWasher* midea_washer = midea_factory->CreateWasher(); haier_cooker->Cooking(); haier_washer->Clothing(); midea_cooker->Cooking(); midea_washer->Clothing(); //clear delete haier_factory; delete midea_factory; delete haier_cooker; delete haier_washer; delete midea_cooker; delete midea_washer; system("Pause"); return 0;}
AbstractFactory:
//abstract_factory.h:#define HELENDP_SOURCE_ABSTRACT_FACTORY_H_#include "abstract_cooker.h"#include "abstract_washer.h"class AbstractFactory{public: AbstractFactory(); virtual ~AbstractFactory(); virtual AbstractCooker* CreateCooker() = 0; virtual AbstractWasher* CreateWasher() = 0;};#endif//abstract_factory.cc:#include "abstract_factory.h"AbstractFactory::AbstractFactory(){}AbstractFactory::~AbstractFactory(){}
HaierFactory:
//haier_factory.h:#ifndef HELENDP_SOURCE_HAIER_FACTORY_H_#define HELENDP_SOURCE_HAIER_FACTORY_H_#include "abstract_factory.h"#include "abstract_cooker.h"#include "abstract_washer.h"class HaierFactory:public AbstractFactory{public: HaierFactory(); ~HaierFactory(); AbstractCooker* CreateCooker(); AbstractWasher* CreateWasher();};#endif//haier_factory.cc#include "haier_factory.h"#include "haier_cooker.h"#include "haier_washer.h"HaierFactory::HaierFactory(){}HaierFactory::~HaierFactory(){}AbstractCooker* HaierFactory::CreateCooker(){ return new HaierCooker();}AbstractWasher* HaierFactory::CreateWasher(){ return new HaierWasher();}
MideaFactory:
//midea_factory.h#ifndef HELENDP_SOURCE_MIDEA_FACTORY_H_#define HELENDP_SOURCE_MIDEA_FACTORY_H_#include "abstract_factory.h"#include "abstract_cooker.h"#include "abstract_washer.h"class MideaFactory:public AbstractFactory{public: MideaFactory(); ~MideaFactory(); AbstractCooker* CreateCooker(); AbstractWasher* CreateWasher();};#endif//midea_factory.cc#include "midea_factory.h"#include "midea_cooker.h"#include "midea_washer.h"MideaFactory::MideaFactory(){}MideaFactory::~MideaFactory(){}AbstractCooker* MideaFactory::CreateCooker(){ return new MideaCooker();}AbstractWasher* MideaFactory::CreateWasher(){ return new MideaWasher();}
AbstractWasher:
//abstract_washer.h#ifndef HELENDP_SOURCE_ABSTRACT_WASHER_H_#define HELENDP_SOURCE_ABSTRACT_WASHER_H_class AbstractWasher{public: AbstractWasher(); virtual ~AbstractWasher(); virtual void Clothing() = 0;};#endif//abstract_washer.cc#include "abstract_washer.h"AbstractWasher::AbstractWasher(){}AbstractWasher::~AbstractWasher(){}
HaierWasher:
//haier_washer.h#ifndef HELENDP_SOURCE_HAIER_WASHER_H_#define HELENDP_SOURCE_HAIER_WASHER_H_#include "abstract_washer.h"class HaierWasher:public AbstractWasher{public: HaierWasher(); ~HaierWasher(); void Clothing();};#endif//haier_washer.cc#include "haier_washer.h"#include <iostream>using namespace std;HaierWasher::HaierWasher(){}HaierWasher::~HaierWasher(){}void HaierWasher::Clothing(){ cout << "Haier Washer Clothing!" << endl;}
MideaWasher:
//midea_washer.h#ifndef HELENDP_SOURCE_MIDEA_WASHER_H_#define HELENDP_SOURCE_MIDEA_WASHER_H_#include "abstract_washer.h"class MideaWasher:public AbstractWasher{public: MideaWasher(); ~MideaWasher(); void Clothing();};#endif//midea_washer.cc#include "midea_washer.h"#include <iostream>using namespace std;MideaWasher::MideaWasher(){}MideaWasher::~MideaWasher(){}void MideaWasher::Clothing(){ cout << "Midea Washer Clothing!" << endl;}
AbstractCooker:
//abstract_cooker.h#ifndef HELENDP_SOURCE_ABSTRACT_COOKER_H_#define HELENDP_SOURCE_ABSTRACT_COOKER_H_class AbstractCooker{public: AbstractCooker(); virtual ~AbstractCooker(); virtual void Cooking() = 0;};#endif//abstract_cooker.cc#include "abstract_cooker.h"AbstractCooker::AbstractCooker(){}AbstractCooker::~AbstractCooker(){}
HaierCooker:
//haier_cooker.h#ifndef HELENDP_SOURCE_HAIER_COOKER_H_#define HELENDP_SOURCE_HAIER_COOKER_H_#include "abstract_cooker.h"class HaierCooker:public AbstractCooker{public: HaierCooker(); ~HaierCooker(); void Cooking();};#endif//haier_cooker.cc#include "haier_cooker.h"#include <iostream>using namespace std;HaierCooker::HaierCooker(){}HaierCooker::~HaierCooker(){}void HaierCooker::Cooking(){ cout << "Haier Cooker Cooing!" << endl;}
MideaCooker:
//midea_cooker.h#ifndef HELENDP_SOURCE_MIDEA_COOKER_H_#define HELENDP_SOURCE_MIDEA_COOKER_H_#include "abstract_cooker.h"class MideaCooker:public AbstractCooker{public: MideaCooker(); ~MideaCooker(); void Cooking();};#endif//midea_cooker.cc#include "midea_cooker.h"#include <iostream>using namespace std;MideaCooker::MideaCooker(){}MideaCooker::~MideaCooker(){}void MideaCooker::Cooking(){ cout << "Midea Cooker Cooing!" << endl;}
代码和UML图(EA)工程文件,最后会整理打包上传.
UML类图
结构
- AbstractFactory(AbstractFactory):抽象工厂
- ConcreteFactory(HaierFactory,MideaFactory):具体工厂
- AbstractProduct(AbstractWasher,AbstractCooker):抽象产品
- ConcreteProduct(HaierWasher,MideaWasher,HaierCooker,MideaCooker);具体产品
优点
- 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛的应用。
- 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
- 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”
缺点
- 在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所有子类的修改,显然会带来较大的不便。
- 开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。
0 0
- 创建型模式-抽象工厂模式(abstract_factory)
- 设计模式之对象创建型 — abstract_factory 抽象工厂模式
- 创建型模式-抽象工厂
- 创建型模式-抽象工厂
- 抽象工厂模式(创建型)
- abstract_factory抽象工厂
- 设计模式-创建型模式-抽象工厂
- [创建型模式:抽象工厂模式]
- 二:创建型模式:抽象工厂模式
- 设计模式-创建型模式-抽象工厂
- 创建型模式之抽象工厂模式
- 【设计模式】创建型模式-抽象工厂
- 创建型模式----抽象工厂模式
- 创建型模式--抽象工厂模式
- 创建型模式之抽象工厂模式
- 创建型模式之抽象工厂模式
- 创建型模式-抽象工厂模式
- 创建型设计模式-抽象工厂模式
- 最大上升子序列和
- 解析波士顿动力Handle机器人背后的技术(附PPT+视频)
- 从1到n整数中1出现的次数
- MySQL的初次见面礼基础实战篇
- 平衡二叉树学习小节
- 创建型模式-抽象工厂模式(abstract_factory)
- 消息队列之ActiveMQ
- jdbc学习笔记
- ConcurrentHashMap
- 用选择法对10个整数排序
- Json数据解析在Unity3d中的应用
- Android5 Lollipop 中关于 SELinux 安全机制调试笔记
- maven创建struts2项目
- 第五届蓝桥杯 省赛 JavaB组 猜字母