C++工厂模式

C++工厂模式

文章目录

  • C++工厂模式
  • 一、工厂模式是什么?
  • 二、为什么使用工厂模式
  • 二、怎样实现
    • 1.简单工厂模式
    • 2.工厂方法模式
    • 3、抽象工厂模式

一、工厂模式是什么?

是C++多态的一种很好的具体表现。通过继承,重写抽象父类的虚函数,并在main函数中通过基类指针指向子类对象的一种编码风格

二、为什么使用工厂模式

1.如果每次需要的对象构造过程都比较复杂,那么就需要很多行的代码去能去创建一个对象。这样就比较麻烦!

2.如果在别的类中又需要创建该对象,那么代码的重复度就很高。

3.需要通过一个工具类,把每个对象创建的具体逻辑给隐藏起来,且只对外分别暴露一个个调用方法。这样就减少了代码量,以后如果想改代码的话,只需要改一处即可,也方便我们日常的维护。

4.该工具类就是工厂模式思想落地实现的一种具体情况,现在只不过很多框架都会自带工厂模式的实现接口。一般不需要我们自己手写,只需简单配置一下就可以使用了

二、怎样实现

1.简单工厂模式

只有一个抽象类,所以它存在的缺点是工厂类中集中了所有的创建逻辑,高内聚的问题并没有得到解决。当需要增加产品时,工厂类需要进行修改,违背了六大准则第一条开闭原则,没有良好的扩展性。但它存在并非偶然,优点是对外隐藏了内部的创建,有利于整个结构的优化。
需要的类
(1)抽象产品类(作为个具体产品基类 、 包含共有的可显示自身产品信息的纯虚方法、 析构函数需要定义为虚函数(多态方面原因))
(2)具体产品类
(3)抽象工厂类(有创建具体产品的方法)

代码如下(示例):使用静态局部变量


#include typedef enum
{Shoes,Coat,Pants
}CLOTHTYPE;class clothing
{
public:virtual void show() = 0;virtual ~clothing() {}
};class shoes:public clothing
{
public:void show(){std::cout << "I'm shoes!" << std::endl;};    
};class coat :public clothing
{
public:void show(){std::cout << "I'm coat!" << std::endl;}
};class pants:public clothing
{
public:void show(){std::cout << "I'm pants!" << std::endl;}
};class factory
{
public:clothing* producecloth(CLOTHTYPE clothtype){switch (clothtype){case Shoes:return new shoes();case Coat:return new coat();case Pants:return new pants();default:return NULL;}}
};
int main()
{factory m_factory;clothing* coat1 = m_factory.producecloth(CLOTHTYPE::Coat);if(coat1)coat1->show();clothing* shoes1 = m_factory.producecloth(CLOTHTYPE::Shoes);if (shoes1)shoes1->show();clothing* pants1 = m_factory.producecloth(CLOTHTYPE::Pants);if (pants1)pants1->show();std::cout << "Hello World!\n";
}

输出结果

I'm coat!
I'm shoes!
I'm pants!
Hello World!

注:


2.工厂方法模式

一个具体的工厂生产一个具体的产品
需要的类
(1)抽象产品类(作为个具体产品基类 、 包含共有的可显示自身产品信息的纯虚方法、 析构函数需要定义为虚函数(多态方面原因))
(2)具体产品类(继承抽象产品类)
(3)抽象工厂类(工厂方法模式的核心类,提供创建具体产品的接口,由具体工厂类实现)
(4)具体工厂类(继承于抽象工厂,实现创建对应具体产品对象的方式)

代码如下(示例)

#include class Clothing
{
public:virtual void show() = 0;virtual ~Clothing() {}
};class Cloes :public Clothing
{void show(){std::cout << "I'm cloes!" << std::endl;}
};class Coat :public Clothing
{void show(){std::cout << "I'm coat!" << std::endl;}
};class Factory
{
public:virtual Clothing* creatfactory() = 0;virtual ~Factory() {}
};class ShoesFactory:public Factory
{
public:Clothing* creatfactory(){return new Cloes;}
};class CoatFactory :public Factory
{
public:Clothing* creatfactory(){return new Coat;}
};int main()
{Factory* shoes_factory = new ShoesFactory();Clothing * m_shoes = shoes_factory->creatfactory();if (m_shoes){m_shoes->show();delete m_shoes;m_shoes = NULL;}Factory* coat_factory = new CoatFactory();Clothing* m_coat = coat_factory->creatfactory();if (m_coat){m_coat->show();delete m_coat;m_coat = NULL;}//std::cout << "Hello World!\n";
}

输出结果

I'm cloes!
I'm coat!

3、抽象工厂模式

一个具体的工厂可生产多个产品
需要的类
(1)抽象产品类(作为个具体产品基类 、 包含共有的可显示自身产品信息的纯虚方法、 析构函数需要定义为虚函数(多态方面原因))
(2)具体产品类(继承抽象产品类)
(3)抽象工厂类(工厂方法模式的核心类,提供创建具体产品的接口,由具体工厂类实现)
(4)具体工厂类(继承于抽象工厂,实现多个创建对应具体产品对象的方式)

代码如下(示例)


#include class Clothing
{
public:virtual void show() = 0;virtual ~Clothing(){}
};class Coat :public Clothing
{void show(){std::cout << "I'm coat!" << std::endl;}
};class Shoes :public Clothing
{void show(){std::cout << "I'm shoes!" << std::endl;}
};
class ComplexFactory
{
public:virtual Clothing*  CreateCoat() = 0;virtual Clothing* CreateShoes() = 0;virtual ~ComplexFactory(){}
};class ClothesFactory :public ComplexFactory
{
public:Clothing* CreateCoat(){return new Coat();}Clothing* CreateShoes(){return new Shoes();}
};int main()
{ComplexFactory* m_coatfactory = new ClothesFactory();Clothing* m_coat = m_coatfactory->CreateCoat();if (m_coat){m_coat->show();delete m_coat;m_coat = NULL;}Clothing* m_shoes = m_coatfactory->CreateShoes();if (m_shoes){m_shoes->show();delete m_shoes;m_shoes = NULL;}
}

输出结果

I'm coat!
I'm shoes!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部