zoukankan      html  css  js  c++  java
  • 设计模式(四)——抽象工厂方法模式

    工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,

    但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销

    此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产

    抽象工厂(Abstract Factory)角色:它声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
    具体工厂(Concrete Factory)角色:它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,
                           这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。
    抽象产品(Abstract Product)角色:它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
    具体产品(Concrete Product)角色:它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

    优点
    1. 拥有工厂方法模式的优点
    2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端
    始终只使用同一个产品族中的对象。
    3 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
    缺点
    1. 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需
    要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。

    适用场景:

    (1) 系统中有多于一个的产品族。 而每次只使用其中某一产品族。可以通过配置文件等方式
     来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
    (2) 产品等级结构稳定。设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构

    #include <iostream>
    using namespace std;
    
    class Fruit
    {
    public:
        virtual void get_name() = 0;
    };
    
    class ChinaApple :public Fruit
    {
    public:
        virtual void get_name()
        {
            cout << "我是中国苹果" << endl;
        }
    };
    
    class ChinaBanana :public Fruit
    {
    public:
        virtual void get_name()
        {
            cout << "我是中国香蕉" << endl;
        }
    };
    
    class USAApple :public Fruit
    {
    public:
        virtual void get_name()
        {
            cout << "我是美国苹果" << endl;
        }
    };
    
    class USABanana :public Fruit
    {
    public:
        virtual void get_name()
        {
            cout << "我是美国香蕉" << endl;
        }
    };
    
    // 抽象工厂
    class AbstractFactory
    {
    public:
        virtual Fruit* create_apple() = 0;
        virtual Fruit* create_banana() = 0;
    };
    
    // 中国工厂
    class ChinaFactory :public AbstractFactory
    {
    public:
        virtual Fruit* create_apple()
        {
            return new ChinaApple;
        }
        virtual Fruit* create_banana()
        {
            return new ChinaBanana;
        }
    };
    
    // 美国工厂
    class USAFactory :public AbstractFactory
    {
    public:
        virtual Fruit* create_apple()
        {
            return new USAApple;
        }
        virtual Fruit* create_banana()
        {
            return new USABanana;
        }
    };
    
    int main()
    {
        AbstractFactory* usa_factory = new USAFactory;
        Fruit* usa_apple = usa_factory->create_apple();
        usa_apple->get_name();
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    Rafy 领域实体框架演示(2)
    Rafy 领域实体框架示例(1)
    Corrupt JPEG data: 1 extraneous bytes before marker 0xd9 JPEG datastream contains no image
    Raw image encoder error: Empty JPEG image (DNL not supported)) in throwOnEror
    QByteArray数据进行CRC32校验时产生的随机结果
    socket 发送字符串0x00时被截断
    invalid argument (errno: 22)
    libpng error: IHDR: CRC error
    Cannot find Makefile. Check your build settings.
    QT中常用工具总结
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10356907.html
Copyright © 2011-2022 走看看