知识的学习在于点滴记录,坚持不懈;知识的学习要有深度和广度,不能只流于表面,坐井观天;知识要善于总结,不仅能够理解,更知道如何表达!
设计模式概念
设计模式简单来说就是在解决某一类问题场景时,有既定的,优秀的代码框架可以直接使用,与我们自己摸索出来的问题解决之道相比较,有以下优点可取:
- 代码更易于维护,代码的可读性,复用性,可移植性,健壮性会更好
- 当软件原有需求有变更或者增加新的需求时,合理的设计模式的应用,能够做到软件设计要求的“开-闭原则”,即对修改关闭,对扩展开放,使软件原有功能修改,新功能扩充非常灵活
- 合理的设计模式的选择,会使软件设计更加模块化,积极的做到软件设计遵循的根本原则“高内聚,低耦合”
因此掌握常用的设计模式非常有必要,无论是找工作,还是对于我们自己的项目软件设计,都很有帮助。
Simple Factory简单工厂
简单工厂(Simple Factory)不属于标准的OOP设计模式中的一项,在编写大型C++软件的时候,代码里面会出现很多的类,每次创建对象的时候,都需要通过new 类名称的方式来生成对象,这样一来,用户需要记忆很多类的名称,暂且不管记不记得住,这样的设计使得代码很难维护,类名如果做了改变,那么所有使用类名称的地方都需要去修改,耦合性太强,不符合我们软件设计的思想,Simple Factory就是在这样的需求下诞生的。
先看看简单工厂模式的UML设计类图:
从上面的UML类图可以看出,所有对象的创建不再通过new 类名称的方式进行了,而是把对象的创建都封装在了SimpleFactory类的createProduct方法当中,通过传入一个事先设计好的枚举类型,然后返回一个对应的对象,既解耦了对象的创建,还不用再记忆那么多的类名。下面通过代码演示SimpleFactory简单工厂的使用,代码如下:
- 产品Product基类
#include <iostream>
#include <string>
#include <memory>
using namespace std;
// 产品类型
class Product
{
public:
Product(string name) :_name(name) {
}
// 模拟产品对象的一个抽象方法
virtual void show() = 0;
protected:
string _name;
};
- 具体的产品Product派生类型
// 产品实体类型定义
class ProductA : public Product
{
public:
ProductA(string name) :Product(name){
}
void show() {
cout << "获取了一个ProductA对象:" << _name << endl; }
};
// 产品实体类型定义
class ProductB : public Product
{
public:
ProductB(string name) :Product(name) {
}
void show() {
cout << "获取了一个ProductB对象:" << _name << endl;
}
};
- 创建描述产品类型的枚举和简单工厂类
// 产类枚举类型定义
enum ProductType
{
XIAOMI,
HUAWEI,
};
// 简单工厂类
class SimpleFactory
{
public:
// 通过传入的枚举类型,创建相应的对象,返回所有对象的基类指针
Product* createProduct(ProductType type)
{
switch (type)
{
case XIAOMI:
return new ProductA("小米手机");
case HUAWEI:
return new ProductB