zoukankan      html  css  js  c++  java
  • [创建型] 抽象工厂模式

    前面讲到工厂方法模式,其实工厂方法模式是抽象工厂模式的特例。工厂方法模式中每个工厂只生产一种产品,而在抽象工厂模式中每个工厂可以生产多种具体产品。

    适用性:(适用性论述是复制过来的,本人不理解!初学)
    一个系统要独立于它的产品的创建、组合和表示时。
    一个系统要由多个产品系列中的一个来配置时。
    当你要强调一系列相关的产品对象的设计以便进行联合使用时。
    当你提供一个产品类库,而只想显示它们的接口而不是实现时。

    已电视机实例,附上代码:

    #include <iostream>
    using namespace std;
    // 抽象工厂模式
    /*

    *
    */
    class TV // 电视机抽象类
    {
    public:
    TV() {}
    virtual ~TV() {}
    virtual void play() = 0;
    };

    class HaierTV : public TV //海尔电视机类
    {
    public:
    HaierTV() {}
    virtual~HaierTV() {}
    virtual void play()
    {
    cout << "海尔电视机播放中..." << endl;
    }
    };

    class TCLTV : public TV //TCL电视机类
    {
    public:
    TCLTV() {}
    virtual ~TCLTV() {}
    virtual void play()
    {
    cout << "TCL电视机播放中..." << endl;
    }
    };

    class AirConditioner // 空调抽象类
    {
    public:
    AirConditioner() {}
    virtual ~AirConditioner() {}
    virtual void changeTemperature() = 0;
    };

    class HaierConditioner : public AirConditioner // 海尔空调类
    {
    public:
    HaierConditioner() {}
    virtual ~HaierConditioner() {}
    virtual void changeTemperature()
    {
    cout << "海尔空调温度改变中..." << endl;
    }
    };

    class TCLConditioner : public AirConditioner // TCL空调类
    {
    public:
    TCLConditioner() {}
    virtual ~TCLConditioner() {}
    virtual void changeTemperature()
    {
    cout << "TCL空调温度改变中..." << endl;
    }
    };

    class AbstructFactory // 抽象工厂类
    {
    public:
    AbstructFactory() {}
    virtual ~AbstructFactory() {}
    virtual TV * ProduceTV() = 0;
    virtual AirConditioner * ProduceAirconditioner() = 0;
    };

    class HaierFactory : public AbstructFactory // 海尔工厂类
    {
    public:
    HaierFactory() {}
    virtual ~HaierFactory() {}
    virtual TV * ProduceTV()
    {
    return new HaierTV();
    }
    virtual AirConditioner * ProduceAirconditioner()
    {
    return new HaierConditioner();
    }
    };

    class TCLFactory : public AbstructFactory // TCL 工程类
    {
    public:
    TCLFactory() {}
    virtual ~TCLFactory() {}
    virtual TV * ProduceTV()
    {
    return new TCLTV();
    }
    virtual AirConditioner * ProduceAirconditioner()
    {
    return new TCLConditioner();
    }
    };

    void main()
    {
    AbstructFactory *af = new HaierFactory;
    TV *htv;
    htv = af->ProduceTV();
    AirConditioner *hcon;
    hcon = af->ProduceAirconditioner();
    htv->play();
    hcon->changeTemperature();
    delete htv;
    delete hcon;
    delete af;

    AbstructFactory *bf = new TCLFactory;
    TV *ttv;
    ttv = bf->ProduceTV();
    ttv->play();
    AirConditioner *tcon;
    tcon = bf->ProduceAirconditioner();
    tcon->changeTemperature();
    delete ttv;
    delete tcon;
    delete bf;
    }

    输出:

       海尔电视机播放中...

       海尔空调温度改变中...

       TCL电视机播放中...

       TCL空调温度改变中...

  • 相关阅读:
    安装Flume的时候出现File Channel transaction capacity cannot be greater than the capacity of the channel capacity -解决方案 摘自网络
    在linux中配置环境变量
    CentOS中安装JAVA环境
    怎么在linux 用nginx做代理 配置.net core
    Another app is currently holding the yum lock; waiting for it to exit.. yum被锁定无法使用
    jQueryUI modal dialog does not show close button (x) JQueryUI和BootStrap混用时候,右上角关闭按钮显示不出图标的解决办法
    C#中 如何处理 JSON中的特殊字符
    php面向对象精要(3)
    php面向对象精要(2)
    php面向对象精要(1)
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2403171.html
Copyright © 2011-2022 走看看