三种工厂模式

1.简单工厂模式

productA 和ProductB继承同一个父类,然后有一个工厂类包含create方法创建这两个类的实例。

使用的时候,在Client中先实例化工厂类,然后调用create方法获取ProductA或B的实例。

2.工厂方法模式

简单工厂模式只用一个工厂,来创建多个Product,这样要添加新产品时就要在它的create方法中加一个分支,违背了开放-封闭原则。

所以有了工厂方法模式,使用多个工厂,需要新产品时新建一个工厂类就ok了。

自己实现代码如下:

//Father.h
#include <iostream>
class Father
{
public:
	Father(){};
	~Father(){};
	virtual void speak() = 0;
};
class Childboy :public Father
{
public:
	Childboy(){};
	~Childboy(){};
	void speak(); 
};
class Childgirl :public Father
{
public:
	Childgirl(){};
	~Childgirl(){};
	void speak();
};
//Father.cpp
#include <iostream>

#include "Father.h"

void Childboy::speak(){
	std::cout << "boy talk" << std::endl;
}

void Childgirl::speak(){
	std::cout << "girl talk" << std::endl;
}
//Factory.h
#include <iostream>
#include "Father.h"
class Factory
{
public:
	Factory(){};
	virtual  Father* create()=0;

};

class FactoryBoy:public Factory
{
public:
	FactoryBoy(){};
	~FactoryBoy(){};
	Father* create();
};
class Factorygirl :public Factory
{
public:
	Factorygirl(){};
	~Factorygirl(){};
	Father* create();
};
//Factory.cpp
#include<iostream>
#include "Factory.h"
using namespace std;
Father* FactoryBoy::create(){
	Father *fa = new Childboy();
	
	return fa;
}
Father* Factorygirl::create(){
	Father *fa = new Childgirl();
	return fa;
}
//Client.cpp
#include "Factory.h"
using namespace std;

void main(){
	Factory *fac1;
	FactoryBoy fb;
	fac1 = &fb;
	Factory *fac2 = new Factorygirl();
	
	Father *father1 = fac1->create();
	Father *father2 = fac2->create();
	father1->speak();
	father2->speak();
	delete(fac2);
	delete(father1);
	delete(father2);
	system("pause");
 
}

3.抽象工厂模式

抽象工厂模式就变得比工厂模式更为复杂,就像上面提到的缺点一样,工厂模式和简单工厂模式要求产品子类必须要是同一类型的,拥有共同的方法,这就限制了产品子类的扩展。于是为了更加方便的扩展,抽象工厂模式就将同一类的产品子类归为一类,让他们继承同一个抽象子类,我们可以把他们一起视作一组,然后好几组产品构成一族。

此时,客户端要使用时必须知道是哪一个工厂并且是哪一组的产品抽象类。每一个工厂子类负责产生一族产品,而子类的一种方法产生一种类型的产品。在客户端看来只有AbstractProductA和AbstractProductB两种产品,使用的时候也是直接使用这两种产品。而通过工厂来识别是属于哪一族产品。

如下图中:ProductA1和2分别是罗技鼠标和微软鼠标,productB1和2分别是键盘,Factory1用来生产罗技的鼠标和键盘,Factory2生产微软。

好处:

  1. 当用户从罗技换到微软时,只要换工厂就ok了,鼠标和键盘全都换了。
  2. 用户只需要知道鼠标和键盘的父类,而不需要知道具体的罗技鼠标类或键盘类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值