工厂模式、抽象工厂模式

工厂模式、抽象工厂模式

工厂模式:

  • what:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,对象创建过程延迟到子类进行。

  • 用相同的行为去根据不同的条件创建不同的实例。适合复杂并且未来有可能扩展的对象。比如一个饭店有好几种披萨,但是披萨的种类还在不断的研发中,就需要扩充披萨这个基类的派生类个数。

    日志服务:根据不同的条件需要将日志记录到不同的存储媒介(如本地文件,本地数据库,远程服务器等)中

    事件上报:根据不同的渠道(如Trap/SMTP/Syslog/Redfish等)上报事件

    数据库连接:根据不同的类型访问不同的数据库(如MemoryDB/LocalDB等)

  • 工厂类代码:

    Shape* shape_factory::get_shape(string name){
    	if(name == 'circle'){
    		return new Circle();
    	}
    	else if(name == 'rect'){
    		return new Rect();
    	}
    	else if(name == 'square'){
    		return new Square();
    	}
    }
    

    可以看到当需要加入新的形状种类时,还需要更改这个工厂代码。这也是违反了CPP设计的某规则。

抽象工厂模式

  • 抽象工厂可以认为是工厂的工厂模式

  • 可以有不同的产品族,如披萨族,糕点族,饮品族;

  • 抽象工厂中,有获取不同族的方法,即获取到某一工厂。而后在工厂内部就是上述的工厂模式:

    如抽象工厂:

    class AbstractFactory{
    public:
    	ShapeFactory* getShapeFactory(){
    		return new shape_factory(); // 即上一节定义的shape工厂
    	}
    	ColorFactory* getColorFactory(){
    		return new color_factory();
            
    	}
    }
    
  • 缺点:扩展性较差,增加产品族需修改抽象工厂代码。

posted @ 2023-08-03 11:48  石中火本火  阅读(8)  评论(0编辑  收藏  举报