简单工厂:通过接口的方式,把实现和变化隔离
接口编程:是一种特殊的抽象类,是一个纯虚类。通常接口来定义类的外部,就相当于一份契约,其实就是根据外部应用
需要的功能,约定了实现类应该要实现的功能。
软件开发中永恒的主题是“变化”,接口的最重要的一个设计语义就是封装变化,也就是隔离变化(内部实现对外部是透
明的)。
从软件的整体结构上来看,只要接口不变,内部实现的变化就不会影响到外部应用,从而使得系统更加灵活,具有更好的
扩展性和可维护性。
设计模式的重点是对象间的结构!!!
如下面的这一套代码:
#include <iostream>
#include <string>
using namespace std;
class Api{
public:
virtual void print(string data) = 0;
protected:
Api(){} //屏蔽构造函数,体现接口
};
class Imple :public Api{
public:
void print(string data){
cout << "print in Imple: " << data << endl;
}
};
//测试用的客户端
int main(){
Api *pApi = new Imple();
pApi->print("运行");
system("pause");
return 0;
}
此程序的封装性;
因为简单工厂要求实现与变化分离;
而Api *pApi = new Imple();中客户已经知道你这里面有一个Imple了;
所以这不是简单工厂所要提现的
下面这个是简单工厂的思想:
#include <iostream>
#include <string>
using namespace std;
class Api{
public:
virtual void print(string data) = 0;
protected:
Api(){}
};
class ImpleOne :public Api{
public:
void print(string data){
cout << "print in ImpleOne: " << data << endl;
}
};
class ImpleTwo :public Api{
public:
void print(string data){
cout << "print in ImpleTwo: " << data << endl;
}
};
//下面的这个是关键了啊,这个Factory具有承上启下的作用
class Factory{
public:
static Api* createApi(int type){
Api *pApi = nullptr;
if (type == 1){
pApi = new ImpleOne;
}
else if (type == 2){
pApi = new ImpleTwo;
}
return pApi;
}
};
/*
使用
传入参数1,可以实现从数据库读入的功能,
传入参数2,可以实现从文本读入的功能
这就是更具接口的公约,实现做什么样的事情
实现和变化隔离,但觉得参数2效率不行时,执行修改2里面的东西,这样就实现了分离
简单工厂:通过接口的方式,把实现和变化隔离
*/
int main(){
Api *pApi = Factory::createApi(1); //感觉就是把2个new的工作放到了Factory里面
pApi->print("简单工厂!"); //如何理解是不是把new放进去就是简单工厂
system("pause");
return 0;
}
//实现了客户调用和implOne,implTwo的解耦合
//factory类实现了变化隔离
简单工厂的定义:
提供一个创建对象实例的功能,而无需关心其具体实现。被创建的类型可以是接口、抽象类,也可以是具体的类。