• [创建型] 抽象工厂模式


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

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

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

    #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空调温度改变中...

  • 相关阅读:
    使用remove_constants工具查看Oracle是否使用绑定变量
    v$sqlarea,v$sql,v$sqltext这三个视图提供的sql语句有什么区别?
    Cardinality (基数)
    分区表操作
    递归连接查询
    解决Android应用安装快完毕时提示签名冲突,android签名文件生成(转)
    Oracle的Numer类型与C,C#数据类型对应关系
    Spring学习(四)——使用Spring JDBC访问数据库
    Spring学习(三)——集成 Velocity
    Spring学习(二)——使用Gradle构建一个简单的Spring MVC Web应用程序
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2403171.html
Copyright © 2020-2023  润新知