C++设计模式五--AbstractFactoryPattern(抽象工厂模式)
来源:互联网 发布:js页面加载完成后执行 编辑:程序博客网 时间:2024/05/23 19:19
定义
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
要点
1)抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么。这样,客户就从具体的产品中被解耦。
2)抽象工厂使用对象的组合,对象的创建被实现在工厂接口所暴露出来的方法中。
3)抽象工厂创建相关的对象家族,而不需要依赖他们的具体类。
类图
AbstractFactory:抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法用来生产产品。
AbstractProductA/AbstractProductB:产品家族,每个具体工厂都能够生产一整组的产品。
ConcreteFactory1/ConcreteFactory2:具体工厂,能够实现不同的产品家族。要创建一个产品,客户只要使用其中的一个工厂而完全不需要实例化任何产品对象。
示例
下面将策略模式中的鸭子用抽象工厂模式来创建。
FlyBehavior.h
#ifndef FLYBEHAVIOR_H#define FLYBEHAVIOR_H#include <iostream>namespace AbstractFactory {using std::cout;using std::endl;class FlyBehavior {public: FlyBehavior() {} virtual ~FlyBehavior() {} virtual void fly() = 0;};class FlyWithWings : public FlyBehavior { void fly() { // 实现鸭子飞行 cout << "FlyWithWings" << endl; }};class FlyNoWay : public FlyBehavior { void fly() { // 什么都不做,不会飞 cout << "FlyNoWay" << endl; }};class FlyRocketPowered : public FlyBehavior { void fly() { // 像火箭一样飞 cout << "FlyRocketPowered" << endl; }};}#endif
QuackBehavior.h
#ifndef QUACKBEHAVIOR_H#define QUACKBEHAVIOR_H#include <iostream>namespace AbstractFactory {using std::cout;using std::endl;class QuackBehavior {public: QuackBehavior() {} virtual ~QuackBehavior() {} virtual void quack() = 0; };class Quack : public QuackBehavior {public: void quack() { // 实现鸭子呱呱叫 cout << "Quack" << endl; }};class Squeak : public QuackBehavior {public: void quack() { // 橡皮鸭子吱吱叫 cout << "Squeak" << endl; }};class MuteQuack : public QuackBehavior {public: void quack() { // 什么都不做,不会叫 cout << "MuteQuack" << endl; }};}#endif
Duck.h
#ifndef DUCK_H#define DUCK_H#include <iostream>#include "FlyBehavior.h"#include "QuackBehavior.h"namespace AbstractFactory {using std::cout;using std::endl;using std::string;class Duck {private: string m_name; FlyBehavior* m_flyBehavior; QuackBehavior* m_quackBehavior;public: Duck(string name) { this->m_name = name; } virtual ~Duck() {} void setFlyBehavior(FlyBehavior* flyBehavior) { m_flyBehavior = flyBehavior; } void setQuackBehavior(QuackBehavior* quackBehavior) { m_quackBehavior = quackBehavior; } void performFly() { cout << m_name << ":"; m_flyBehavior->fly(); } void performQuack() { cout << m_name << ":"; m_quackBehavior->quack(); }};// 绿头鸭class MallardDuck : public Duck {private: FlyBehavior* flyBehavior; QuackBehavior* quackBehavior;public: MallardDuck() : Duck("MallardDuck") { flyBehavior = new FlyWithWings(); quackBehavior = new Quack(); this->setQuackBehavior(quackBehavior); this->setFlyBehavior(flyBehavior); } virtual ~MallardDuck() { delete flyBehavior; delete quackBehavior; } void display() { cout << "I'm a real Mallard duck!" << endl; }};// 模型鸭class ModelDuck : public Duck {private: FlyBehavior* flyBehavior; QuackBehavior* quackBehavior;public: ModelDuck() : Duck("ModelDuck") { flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); this->setQuackBehavior(quackBehavior); this->setFlyBehavior(flyBehavior); } ~ModelDuck() { delete flyBehavior; delete quackBehavior; } void display() { cout << "I'm a model duck!" << endl; }};// 橡皮鸭class RubberDuck : public Duck {private: FlyBehavior* flyBehavior; QuackBehavior* quackBehavior;public: RubberDuck() : Duck("RubberDuck") { flyBehavior = new FlyNoWay(); quackBehavior = new Squeak(); this->setQuackBehavior(quackBehavior); this->setFlyBehavior(flyBehavior); } ~RubberDuck() { delete flyBehavior; delete quackBehavior; } void display() { cout << "I'm a model duck!" << endl; }};}#endif
AbstractDuckFactory.h
#ifndef ABSTRACTDUCKFACTORY_H#define ABSTRACTDUCKFACTORY_H#include "Duck.h"namespace AbstractFactory {// 抽象工具接口 class AbstractDuckFactory{public: AbstractDuckFactory() {} virtual ~AbstractDuckFactory() {} virtual Duck* createMallardDuck() = 0; virtual Duck* createModelDuck() = 0; virtual Duck* createRubberDuck() = 0;};// 鸭子工厂class DuckFactory : public AbstractDuckFactory{public: DuckFactory() {} virtual ~DuckFactory() {} Duck* createMallardDuck() { return new MallardDuck(); } Duck* createModelDuck() { return new ModelDuck(); } Duck* createRubberDuck() { return new RubberDuck(); } };}#endif
main.cpp
#include "AbstractDuckFactory.h"using namespace AbstractFactory;int main(){ AbstractDuckFactory* duckFactory = new DuckFactory(); Duck* rubber = duckFactory->createRubberDuck(); Duck* mallardDuck = duckFactory->createMallardDuck(); rubber->performQuack(); rubber->performFly(); mallardDuck->performQuack(); mallardDuck->performFly(); delete rubber; delete mallardDuck; delete duckFactory;}
测试
测试结果如下:
阅读全文
1 0
- C++设计模式五--AbstractFactoryPattern(抽象工厂模式)
- 设计模式------抽象工厂模式(AbstractFactoryPattern)
- 设计模式-抽象工厂模式(AbstractFactoryPattern)
- 抽象工厂模式AbstractFactoryPattern
- 抽象工厂模式AbstractFactoryPattern
- 设计模式——抽象工厂模式(AbstractFactoryPattern)
- C++设计模式之——抽象工厂模式(AbstractFactoryPattern)
- c++设计模式五,抽象工厂模式
- 设计模式(五) -- 抽象工厂及各种工厂总结
- 设计模式系列(五)——抽象工厂模式
- 设计模式(五)——抽象工厂模式
- 设计模式(五)抽象工厂模式详解
- 设计模式(五)——抽象工厂模式
- 设计模式的实现(C++)------抽象工厂模式(AbstractFactory)
- C语言和设计模式(抽象工厂模式)
- C语言和设计模式(抽象工厂模式)
- C语言和设计模式(抽象工厂模式)
- C语言和设计模式(抽象工厂模式)
- unity用www加载图片出现一个问号。
- 关于web手机端资料
- A strange lift
- nrm —— 快速切换 NPM 源
- 常量池的理解
- C++设计模式五--AbstractFactoryPattern(抽象工厂模式)
- UITableView分割线短,左右侧都不顶格
- C# 将json字符串转换为键值对形式,用于执行form表单形式的请求
- 读《造房子》
- 实现敌人(怪物)的简单AI(自动巡逻、看到玩家攻击玩家、玩家离开恢复自动巡逻)
- 在finder中显示隐藏文件
- 获取某一目录下某一类文件的文件名(QDir)
- Python机器学习应用 | 监督学习
- 搬砖中的小事(四)之工具--通过打开的文件进入其所在的目录配置