设计模式之工厂模式

工厂模式

一.简单工厂模式

 

# include<iostream>
using namespace std;

class product{
	public:
		virtual void Do()=0;
}; 

class productA:public product{
	public:
		void Do(){
			cout<<"生产A"<<endl;
		}
};

class productB:public product{
	public:
		void Do(){
			cout<<"生产B"<<endl;
		}
};

class productC:public product{
	public:
		void Do(){
			cout<<"生产C"<<endl;
		}
};

class Factory{
	private:
		product*p;
		public:
			Factory(int n){
				switch(n){
					case 1:p=new productA();
					  		break;
					case 2:
						p=new productB();
						break;
					case 3:
						p=new productC();
						break;
				}
			}
			
			void send(){
				p->Do();
			}
			
			~Factory(){
				delete p;
			}
}; 

int main(void){
	Factory *factory=new Factory(2);
	factory->send();
}

以上代码好处是接口统一,但违背了开闭原则,添加一个功能就要增加一个case产品

将Factory代码改进如下

class Factory{
	private:
		product*p;
		public:
			Factory(product *t){
				p=t;
			}
			
			void send(){
				p->Do();
			}
			
			~Factory(){
				delete p;
			}
}; 

这样做将压力转向了客户端

但遵守了开闭原则

 

二.抽象工厂

让不同工厂负责不同产品

#include <iostream>
using namespace std;

class product{
	public :
	virtual void Do()=0; 
};

class productA:public product{
	public:
		void Do(){
			cout<<"生产A"<<endl;
		}
};

class productB:public product{
	public:
		void Do(){
			cout<<"生产B"<<endl;
		}
};

class productC:public product{
	public:
		void Do(){
			cout<<"生产C"<<endl;
		}
};


class Factory{
	private:
		product *p;
	public:
		Factory(product*t){
			p=t;
		}
		 void send(){
		 	p->Do();
		 }
		virtual~Factory(){
			delete p;
		}
};

class FactoryA:public Factory{
	public:
		FactoryA(product*t):Factory(t){
			
		}
	
};

class FactoryB:public Factory{
	public:
		FactoryB(product*t):Factory(t){
			
		}
	
};

class FactoryC:public Factory{
	public:
		FactoryC(product*t):Factory(t){
			
		}
	
};

int main(void){
	Factory *fa=new FactoryA(new productA());
	fa->send();
	delete fa;
}

以上代码分别让三个工厂去生产三种产品,减轻了客户端的压力,让不同的工厂分别管理 不同的产品

注:

以上代码工厂类的三个派生类都将代码实现了抽取到基类中,这样在代码量大的时候会明显体现出将相同代码抽取到基类的好处

使代码得到了复用,更加简洁.

(1)相同的构造函数,直接调用基类构造函数进行初始化

(2)send()函数完成的功能也都相似,都是调用当前工厂类指向的生产对象,并调用生产对象的Do()函数

因此可以抽取到基类中,当客户端调用时,在派生类中没找到send()方法,则直接去基类中找

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值