软件设计模式概念篇
创建型模式
1、创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。
2、为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不需要清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。
3、创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。
工厂方法模式(Factory Method)
模式动机:
定义一个抽象工厂类,并在具体工厂类里重写这个抽象工厂类中定义的抽象方法。抽象化的结果使这种结构可以在不修改已有具体工厂类的情况下引进新的产品。
模式定义:
1、定义一个用于创建对象的接口,让子类决定实例化哪一个类。
2、在工厂方法模式中,父类负责定义创建对象的公共接口,而子类则负责生成具体的对象,将类的实例化操作延迟到子类中完成。
3、工厂方法模式属于类创建型模式。
结构
定义抽象产品接口(Product):定义一个抽象产品接口,它声明了产品对象的通用属性和方法。所有具体产品类都必须实现这个接口方法。
创建具体产品类(Concrete Product):实现抽象产品接口的具体产品类。每个具体产品类表示一种具体的产品。
定义抽象工厂接口(Creator):创建一个抽象工厂接口,该接口声明了工厂方法,用于创建产品对象。
创建具体工厂类(Concrete Creator):实现抽象工厂接口的具体工厂类,每个具体工厂类负责创建特定类型的产品。在客户端中使用工厂方法:
代码实现
#include<iostream>
#include<string>
using namespace std;
//抽象产品
class Product
{
public:
virtual void productMethod() = 0;
};
//具体产品1
class ConcreteProduct_Xiaomi : public Product
{
void productMethod() override
{
cout << "小米手机生产。" << endl;
}
};
//具体产品2
class ConcreteProduct_Huawei : public Product
{
void productMethod() override
{
cout << "华为手机生产。" << endl;
}
};
//抽象工厂
class Creator
{
public:
virtual Product* factoryMethod() = 0;
};
//具体工厂1
class ConcreteCreator_Xiaomi : public Creator
{
public:
Product* factoryMethod() override
{
return new ConcreteProduct_Xiaomi();
}
};
//具体工厂2
class ConcreteCreator_Huawei : public Creator
{
public:
Product* factoryMethod() override
{
return new ConcreteProduct_Huawei();
}
};
int main()
{
//使用具体工厂创建具体产品
Creator* Xiaomi_Fac = new ConcreteCreator_Xiaomi();
Product* Xiaomi_pro = Xiaomi_Fac->factoryMethod();
Xiaomi_pro->productMethod();
Creator* Huawei_Fac = new ConcreteCreator_Huawei();
Product* Huawei_pro = Huawei_Fac->factoryMethod();
Huawei_pro->productMethod();
}
应用场景
后续补充
抽象工厂模式(Abstract Factory)
模式动机:
在工厂方法模式中,每个具体工厂对应一种具体产品。有时,我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象。
抽象工厂模式定义:
1、提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2、抽象工厂模式属于对象创建型模式
结构:
抽象工厂接口(Abstract Factory): 定义了一组方法,每个方法用于创建某一类对象,通常包括多个产品族的创建方法。
具体工厂类(Concrete Factory): 实现了抽象工厂接口,负责创建具体的产品对象。每个具体工厂类通常对应一个产品族。
抽象产品接口(Abstract Product): 义了一组方法,用于描述产品的通用行为。
具体产品类(Concrete Product): 实现了抽象产品接口,表示真正的产品对象。每个具体产品类属于某个产品族。
代码实现:
#include<iostream>
#include<string>
using namespace std;
//抽象手机产品
class aF_ProductPhone
{
public:
virtual void phoneMethod() = 0;
};
//具体产品-小米手机
class aF_ConcreteProductPhone_Xiaomi : public aF_ProductPhone
{
public:
void phoneMethod() override
{
cout << "小米手机生产。" << endl;
}
};
//具体产品-华为手机
class aF_ConcreteProductPhone_Huawei : public aF_ProductPhone
{
public:
void phoneMethod() override
{
cout << "华为手机生产。" << endl;
}
};
//抽象电脑产品
class aF_ProductComputer
{
public:
virtual void computerMethod() = 0;
};
//具体产品-小米电脑
class aF_ConcreteProductComputer_Xiaomi : public aF_ProductComputer
{
public:
void computerMethod() override
{
cout << "小米电脑生产。" << endl;
}
};
//具体产品-华为电脑
class aF_ConcreteProductComputer_Huawei : public aF_ProductComputer
{
public:
void computerMethod() override
{
cout << "华为电脑生产。" << endl;
}
};
//抽象工厂
class aF_AbstractFactory
{
public:
virtual aF_ProductPhone* createPhone() = 0;
virtual aF_ProductComputer* createComputer() = 0;
};
//具体工厂-小米
class aF_XiaomiFactory : public aF_AbstractFactory
{
public:
aF_ProductPhone* createPhone() override
{
return new aF_ConcreteProductPhone_Xiaomi();
}
aF_ProductComputer* createComputer() override
{
return new aF_ConcreteProductComputer_Xiaomi();
}
};
//具体工厂-华为
class aF_HuaweiFactory : public aF_AbstractFactory
{
public:
aF_ProductPhone* createPhone() override
{
return new aF_ConcreteProductPhone_Huawei();
}
aF_ProductComputer* createComputer() override
{
return new aF_ConcreteProductComputer_Huawei();
}
};
int main()
{
//小米工厂
aF_AbstractFactory* xiaomiFac = new aF_XiaomiFactory();
aF_ProductPhone* xiaomiPhone = xiaomiFac->createPhone();
xiaomiPhone->phoneMethod();
aF_ProductComputer* xiaomiComputer = xiaomiFac->createComputer();
xiaomiComputer->computerMethod();
//华为工厂
aF_AbstractFactory* huaweiFac = new aF_HuaweiFactory();
aF_ProductPhone* huaweiPhone = huaweiFac->createPhone();
huaweiPhone->phoneMethod();
aF_ProductComputer* huaweiComputer = huaweiFac->createComputer();
huaweiComputer->computerMethod();
}
应用场景
后续补充
单例模式(Singleton Pattern)
模式动机:
对于系统中的某些类来说,有且只能有一个实例。
(1)一个系统只能有一个窗口管理器。
(2)系统中可以有许多打印机,但是只能有一个打印机正在工作。
单例模式定义:
1、确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例。
2、单例模式属于对象创建型模式。
3、单例负责类的实例的创建,且是唯一的。因此,在单例类的外部无法使用new创建。否则,该类的实例对象就不是单例。
结构:
代码实现:
懒汉式单例模式:
饿汉式单例模式:
应用场景
后续补充
持续更新中