简单工厂SimpleFactory

工厂模式是一种创建型设计方法(封装对象的创建),包含两种:

  1. 工厂方法:factory method
  2. 抽象工厂: abstract factory

简单工厂并不属于我们经常说的23种设计模式中的,但是也是一种设计方法,之前在工程代码看到好多次,今天花一点时间来总结一下,这种方法的原理、使用以及利弊。

  1. 由来:
    在实际的开发中,存在大量的类,这就需要我们开发者知道类的名称,需要我们自己手动的去new大量的对象。在实际生活中,我们使用的生活用品都来自于工厂,我们很少说是自己去生产生活用品,更多的是从工厂中获取这些生活用品。
  2. 使用实例:
#include <iostream>
#include <string>

//所有类都应该有自己的基类,驱动类
class Device{
public:
	Device(std::string name):name_(name){}
	virtual void show() = 0;
protected:
	std::string name_;
};

//一个具体的类从它的基类派生而来,驱动srr
class Srr :public Device{
public:
	Srr(std::string name):Device(name){}
	void show(){
		std::cout << "Get a device name:" << name_ << std::endl;
	}
};
//一个具体的类从它的基类派生而来,驱动esr
class Esr :public Device{
public:
	Esr(std::string name) :Device(name){}
	void show(){
		std::cout << "Get a device name:" << name_ << std::endl;
	}
};

//简单工厂
class Simplefactory{
public:
	Device * GetDevice(const std::string name){
		Device *ptr = nullptr;
		if ("srr" == name){
			ptr = new Srr("srr");
		}
		else if ("esr" == name){
			ptr = new Esr("esr");
		}
		/*
		Add other classes
		*/
		return ptr;;
	}
};

使用者只需要通过简单工厂对象实例去创建自己想要的对象:

void  main(void){
	Simplefactory * sp = new Simplefactory();
	Device * srr = sp->GetDevice("srr");
	//需要告诉工厂对应对象的创建的标志,如"srr"
	srr->show();
	Device * esr = sp->GetDevice("esr");
	esr->show();
	delete srr;
	delete esr;
	delete sp;
}

4. 分析:

优点:
1.将对象创建封装起来,不需要使用者自己new对象,相对比较快捷;
2.向工厂传入我们想要构造的产品名,即可以获取出来。
缺点:
1.将所有的驱动放在同一个工厂显然不符合实际,比如说宝马车工厂会生成奥迪车吗?
2.当驱动数量多了,简单工厂中Device * GetDevice(const std::string name)
部分必然会变得越来越臃肿,无论是if还是switch方法,影响美观;
3.不符合"开闭"原则(修改关,扩展开),我们要不停的修改工厂代码,不符合设计理念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值