首页 > 代码库 > 1.工厂模式
1.工厂模式
一、工厂模式
(1)简单工厂模式
例:一个工厂只能够生产两种产品A和B,客户需要什么产品一定要显示地告诉工厂。
这种设计方式的缺点:
要增加新产品时,需要修改工厂类。
违背了开放封闭原则:软件实体(类、模板、函数)可以扩展,但不可以修改。所以工厂方法模式出现了。
//产品类型enum TYPE { TYPEA, TYPEB };//产品基类class CProduct {public: virtual void Show() = 0;};//A产品类class CProductA : public CProduct {public: virtual void Show() { std::cout << "Production A." << std::endl; }};//B产品类class CProductB : public CProduct {public: virtual void Show() { std::cout << "Production B." << std::endl; }};//工厂类,可以生产两种产品class CFactory {public: CProduct* CreateProduct(TYPE type) { if (TYPEA == type) { return new CProductA; } if (TYPEB == type) { return new CProductB; } return nullptr; }};
(2)工厂方法模式
工厂方法模式是对每种产品单独建一个工厂,客户需要某种产品直接找生产该产品的工厂,就不需要告诉工厂产品类型。
这种设计方式的缺点是:每增加一种新产品就要增加一个新工厂。这样,就要定义更多的类。
//产品类型enum TYPE { TYPEA, TYPEB };//产品基类class CProduct {public: virtual void Show() = 0;};//A产品类class CProductA : public CProduct {public: virtual void Show() { std::cout << "Production A." << std::endl; }};//B产品类class CProductB : public CProduct {public: virtual void Show() { std::cout << "Production B." << std::endl; }};//生产产品A的工厂class CFactoryA {public: CProductA* CreateProductA() { return new CProductA; }};//生产产品B的工厂class CFactoryB {public: CProductB* CreateProductB() { return new CProductB; }};
(3)抽象工厂模式
假设这家公司技术进步,不仅可以生产A和B,还能生产改进型A1和B1,现在简单工厂模式和工厂方法模式是不合适的。因此,抽象工厂模式出现了,
它定义了一个创建一些列或相互依赖对象的接口,而无需指定它们具体的类,这样还是两个工厂,一个生产A和A1,另一个生产B和B1。
//产品类型enum TYPE { TYPEA, TYPEB };//产品基类class CProduct {public: virtual void Show() = 0;};//A产品类class CProductA : public CProduct {public: virtual void Show() { std::cout << "Production A." << std::endl; }};//B产品类class CProductB : public CProduct {public: virtual void Show() { std::cout << "Production B." << std::endl; }};//改进型产品基类class CProductUpdated {public: virtual void Show() = 0;};//改进型产品Aclass CProductA1 : public CProductUpdated {public: virtual void Show() { std::cout << "Product A1." << std::endl; }};//改进型产品Bclass CProductB1 : public CProductUpdated {public: virtual void Show() { std::cout << "Product B1." << std::endl; }};//工厂类class CFactory {public: virtual CProduct* CreateProuct() = 0; virtual CProductUpdated* CreateProductUpdated() = 0;};//生产A和A1的工厂class CFactoryA : public CFactory {public: virtual CProduct* CreateProuct() { return new CProductA; } virtual CProductUpdated* CreateProductUpdated() { return new CProductA1; }};//生产B和B1的工厂class CFactoryB : public CFactory {public: virtual CProduct* CreateProuct() { return new CProductB; } virtual CProductUpdated* CreateProductUpdated() { return new CProductB1; }};
1.工厂模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。