工厂模式、抽象工厂模式
工厂模式:
-
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(); } }
-
缺点:扩展性较差,增加产品族需修改抽象工厂代码。