首页 > 代码库 > Abstract Factory 抽象工厂模式
Abstract Factory 抽象工厂模式
提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具体实现,创建一组具体的对象。
以下情况可以使用抽象工厂模式:
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
抽象工厂模式的优缺点:
- 他分离了具体的类
- 它使得易于交换产品系列
- 它有利于产品的一致性
- 难以支持新种类的产品
在实现时最好将工厂作为单件。
如果有多个可能的产品系列,具体工厂也可以使用Prototype原型模式来实现。具体工厂使用产品系列中每一个产品的实例来初始化,且通过复制它的原型来创建新的产品。在基于原型的方法中,使得不是每个新的产品系列都需要一个新的具体工厂类。
定义可扩展的工厂。比如用参数指定将被创建的对象的种类。注意所有的产品都将返回相同类型的抽象接口给用户,可以用dynamic_cast进行类型转换,但是也有可能失败。
1 #include <iostream> 2 #include <string> 3 4 class AbstractProduct { 5 public: 6 virtual ~AbstractProduct() {} 7 virtual void message() = 0; 8 }; 9 class Product : public AbstractProduct {10 virtual ~Product() {}11 virtual void message() {12 std::cout << "我是一个普通的Product" << std::endl;13 }14 };15 class ProductEx : public AbstractProduct {16 virtual ~ProductEx() {}17 virtual void message() {18 std::cout << "我是加强后的Product" << std::endl;19 }20 };21 22 class AbstractObject {23 public:24 virtual ~AbstractObject() {}25 virtual void gao() = 0;26 };27 class Object : public AbstractObject {28 virtual ~Object() {}29 virtual void gao() {30 std::cout << "虽然叫做Object,但是只是一个普通的Object" << std::endl;31 }32 };33 class ObjectEx : public AbstractObject {34 virtual ~ObjectEx() {}35 virtual void gao() {36 std::cout << "虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object" << std::endl;37 }38 };39 40 class AbstractFactory {41 public:42 virtual AbstractProduct* CreateProduct() = 0;43 virtual AbstractObject* CreateObject() = 0;44 virtual ~AbstractFactory() {}45 protected:46 AbstractFactory(){}47 AbstractFactory(const AbstractFactory&);48 AbstractFactory& operator=(const AbstractFactory&);49 };50 51 class ConcreteFactory : public AbstractFactory {52 public:53 virtual AbstractProduct* CreateProduct() {54 return new Product();55 }56 virtual AbstractObject* CreateObject() {57 return new Object();58 }59 static ConcreteFactory* Instance() {60 static ConcreteFactory _instance;61 return &_instance;62 }63 };64 65 class ExtraFactory : public AbstractFactory {66 public:67 virtual AbstractProduct* CreateProduct() {68 return new ProductEx();69 }70 virtual AbstractObject* CreateObject() {71 return new ObjectEx();72 }73 static ExtraFactory* Instance() {74 static ExtraFactory _instance;75 return &_instance;76 }77 };
测试代码
1 #include <iostream> 2 #include "Abstract_Factory.h" 3 4 using namespace std; 5 6 int main() 7 { 8 auto fac = ConcreteFactory::Instance(); 9 auto pro = fac->CreateProduct();10 auto obj = fac->CreateObject();11 pro->message();12 obj->gao();13 14 auto facEx = ExtraFactory::Instance();15 auto proEx = facEx->CreateProduct();16 auto objEx = facEx->CreateObject();17 proEx->message();18 objEx->gao();19 20 system("pause");21 }
测试结果
1 我是一个普通的Product2 虽然叫做Object,但是只是一个普通的Object3 我是加强后的Product4 虽然叫做ObjectEx好像很厉害的样子,其实还是一个普通的Object5 请按任意键继续. . .
Abstract Factory 抽象工厂模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。