设计模式是用来服务程序员的,换而言之,我们成为了语言的用户。
—— fitz
为什么会有简单工厂模式的出现?
在类的设计中,我们或许会对某些具备相似特点的不同类不断的进行创建释放。
OO开发的核心特点是:高内聚、低耦合思想下的继承、封装、抽象、多态。
相似在于具备一定的共性,如所有的图形如果展现在GUI的程序中必然需要将其打印到屏幕上,此时打印这个动作便可以被抽象出来。再如数据库设计过程中,一般设置为client-server架构,client需要向数据库的server模块传输 sql命令,(即使是 胡乱发送,也可以视为错误命令),此时可以根据命令类型的不同如delete、insert再去细化。我们已经下意识就将命令这个类给抽象出来了。
不同在于,每个类都有自己特点,在GUI界面下的图形必然有各自的实现形式。
那么如何有效的满足这种需求呢?
我们可以写一个新的类,专门负责对象的建立和释放,创建完毕的对象的各种操作,和这个类没有任何关系。这个专门建立对象的类,向外暴漏创建对象的接口,供外部调用。工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。
我们考虑下如何实现吧。
比如,华强北电子厂根据销售在广东跑来的订单生产不同类型的电子产品,黑心资本家根据订单经常性的让员工今天生产以次充新的kindle,明天生产换屏iPhone。如何实现小型华强北呢?
电子厂负责生产电子产品,电子产品分为电纸书、手机。
电子产品作为父类,电纸书和手机作为子类继承父类方法。
电子厂作为工厂负责提供产品。
完整代码
#include<iostream>
#include<string>
using namespace std;
/*
e_book =0,
e_phone,
e_pad,
e_watch,
e_computer
*/
typedef enum e_type{
create_e_book =0,
create_e_phone,
create_e_pad,
create_e_watch,
create_e_computer
}e_type;
#define DELETE_PTR(p) if((p)!= nullptr)\
{\
delete p;\
p = nullptr;\
}\
// base class
class e_product{
public:
e_product(){}
virtual ~e_product(){}
private:
e_product(const e_product&) = delete;
void operator = (const e_product&) =delete;
public:
virtual void start_product() = 0;
virtual void end_product() = 0;
};
class e_book:public e_product{
public:
e_book():device("kindle paperwhite 5"){
std::cout<<device<<std::endl;}
~e_book(){}
public:
virtual void start_product(){
std::cout<<"设备开机,阅读《人类简史》,"<<std::endl;
}
virtual void end_product(){
std::cout<<"读累了,设备关机。"<<std::endl;
}
private:
string device;
};
class e_phone:public e_product{
public:
e_phone():device("iphone 4s"){
std::cout<<device<<std::endl;
}
~e_phone(){}
public:
virtual void start_product(){
std::cout<<"设备开启,打电话给乔布斯"<<std::endl;
}
virtual void end_product(){
std::cout<<"跟乔帮主聊的很der,设备关闭。"<<std::endl;
}
private:
string device;
};
class product_Factory{
public:
static e_product * create_product(e_type product_type){
e_product * product_object = nullptr;
switch(product_type){
case create_e_book :{
product_object = new e_book();
break;
}
case create_e_phone:{
product_object = new e_phone();
break;
}
default:
break;
}
return product_object;
}
};
int main(){
e_product *product = nullptr;
std::cout<<" 想看电子书了,意念创建一个函数请求 工厂帮我 创建 电子书"<<std::endl;
product = product_Factory::create_product(create_e_book);
if(product){
product->start_product();
product->end_product();
DELETE_PTR(product);
}
std::cout<<" 想跟乔布斯骂一下cook的刀法精准,意念创建一个函数请求 工厂帮我 创建 手机"<<std::endl;
product = product_Factory::create_product(create_e_phone);
if(product){
product->start_product();
product->end_product();
DELETE_PTR(product);
}
}
7、运行结果