C++设计模式之简述三种工厂模式

在这三种工厂模式下仍有许多缺点,下面这篇博客提供了更为详细的解答:
https://blog.csdn.net/u012156116/article/details/80857255

相关知识:
使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。
开放封闭原则:类的改动是通过增加代码进行的,而不是修改源代码。
依赖倒置原则:依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程。

1、简单工厂模式
无需了解创建对象的过程,相当于屏蔽了创建对象的过程,即把这个过程封装在一个Factory类里。
例1:

/*************************************************************************
	> File Name:   3_简单工厂模式.cpp
	> Author:      ls
	> Mail:        1096475833@qq.com 
	> Created Time: 2019年07月07日 星期日 14时19分55秒
 ************************************************************************/

//创建一个水果的虚基类,然后派生出苹果和香蕉;创建一个工厂,既可以生产苹果,也可以生产香蕉
//但是我们又可以发现,当工厂添加一种新的生产产品时,不能通过添加代码,只能对工厂的代码进行修改,这违背了开放封闭原则
#include<iostream>
using namespace std;

class Fruit             //水果虚基类
{
public:
	virtual void work() = 0;
};

class Apple:public Fruit         //苹果
{
public:
	void work()
	{
		cout<<"this is apple"<<endl;
	}
};

class Banana:public Fruit        //香蕉
{
public:
	void work()
	{
		cout<<"this is banana"<<endl;
	}
};

class Factory
{
public:
	Fruit *GetApple()            //生产苹果
	{
		return new Apple; 
	}

	Fruit *GetBanana()          //生产香蕉
	{
		return new Banana;
	}
};

int main()
{
	Factory *p = new Factory;
	Fruit *f = p->GetApple();
	f->work();
	delete f;

	f = p->GetBanana();
	f->work();
	delete f;

	return 0;
}

我们发现简单工厂模式的工厂不满足“高内聚”的特点,即一个类一个功能;想要增加功能,势必要修改工厂里的代码,不符合开放封闭原则。

2、工厂模式
克服了简单工厂模式违背开放-封闭原则的缺点,又保留了封装对象创建过程的优点,降低客户端和工厂的耦合性。所以说,“工厂方法模式”是“简单工厂模式”的进一步抽象和推广。
例2:

/*************************************************************************
	> File Name:   4_工厂模式.cpp
	> Author:      ls
	> Mail:        1096475833@qq.com 
	> Created Time: 2019年07月07日 星期日 14时19分55秒
 ************************************************************************/
/*在简单工厂的基础之上创建一个工厂的虚基类,然后派生出生产各种产品(这些产品同属于一个类)的工厂;但当我们想让这个工厂生产其他类时,势必要修改工厂,但这样又违背了开放封闭原则*/

#include<iostream>
using namespace std;

class Fruit                         //水果虚基类
{
public:
	virtual void work() = 0;
};

class Apple:public Fruit               //苹果
{
public:
	void work()
	{
		cout<<"this is apple"<<endl;
	}
};

class Banana:public Fruit             //香蕉
{
public:
	void work()
	{
		cout<<"this is banana"<<endl;
	}
};

class Factory                      //工厂虚基类
{
public:
	virtual Fruit*work() = 0;
};

class AppleFactory:public Factory          //生产苹果的工厂
{
public:
	Fruit*work()
	{
		return new Apple;
	}
};

class BananaFactory:public Factory           //生产香蕉的工厂
{
	Fruit *work()
	{
		return new Banana;
	}
};

int main()
{
	Factory *p = new AppleFactory;
	Fruit *f = p->work();
	f->work();

	delete f;
	delete p;

	p = new BananaFactory;
	f = p->work();
	f->work();

	delete f;
	delete p;

	return 0;
}

3、抽象工厂模式
为了更接近生活,一个工厂里并不可能只生产一种产品,使用抽象工厂可以实现一个工厂生产多种产品。
它的缺点仍是不能给很好的满足开放封闭原则,因为一个工厂里包含了多种功能。
例3:

/*本例中A、B两个工厂都生产水果和玩具,A工厂生产苹果、猴子玩具
,B工厂生产香蕉、猫玩具*/
/*************************************************************************
	> File Name:   5_抽象工厂模式.cpp
	> Author:      ls
	> Mail:        1096475833@qq.com 
	> Created Time: 2019年07月07日 星期日 14时19分55秒
 ************************************************************************/

#include<iostream>
using namespace std;

class Fruit
{
public:
	virtual void work() = 0;
};

class Apple:public Fruit
{
public:
	void work()
	{
		cout<<"this is apple"<<endl;
	}
};

class Banana:public Fruit
{
public:
	void work()
	{
		cout<<"this is banana"<<endl;
	}
};

class Toy                             //玩具虚基类
{
public:
	virtual void work() = 0;
};

class Monkey:public Toy                  //猴子玩具
{
public:
	void work()
	{
		cout<<"this is monkey toy"<<endl;
	}
};

class Cat:public Toy                   //猫玩具
{
public:
	void work()
	{
		cout<<"this is cat toy"<<endl;
	}
};


class Factory                      //虚基类工厂,有两个功能,这也违背了开放封闭原则
{
public:
	virtual Fruit*GetFruit() = 0;
	virtual Toy*GetToy() = 0;
};

class AFactory:public Factory         //A工厂生产苹果、猴子玩具
{
public:
	Fruit*GetFruit()
	{
		return new Apple;
	}
	Toy*GetToy()
	{
		return new Monkey;
	}
};

class BFactory:public Factory       //B工厂生产香蕉、猫玩具
{
	Fruit *GetFruit()
	{
		return new Banana;
	}
	Toy*GetToy()
	{
		return new Cat;
	}
};

int main()
{
	Factory *f = new AFactory;
	Fruit *p = f->GetFruit();
	Toy *q = f->GetToy();
	p->work();
	q->work();

	delete q;
	delete p;
	delete f;

	f = new BFactory;
	p = f->GetFruit();
	q = f->GetToy();
	p->work();
	q->work();

	delete q;
	delete p;
	delete f;


	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值