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
原创粉丝点击