yuyi
工厂模式
typedef enum productType {
TypeA,
TypeB,
TypeC
} productTypeTag;
class Product {
public:
virtual void show() = 0;
virtual ~Product() = 0;
};
class ProductA :public Product {
public:
void show() {
cout << "ProductA" << endl;
}
~ProductA() {
cout << "~ProductA" << endl;
}
};
class ProductB :public Product {
public:
void show() {
cout << "ProductB" << endl;
}
~ProductB() {
cout << "~ProductB" << endl;
}
};
class ProductC :public Product {
public:
void show() {
cout << "ProductC" << endl;
}
~ProductC() {
cout << "~ProductC" << endl;
}
};
class Factory {
public:
Product* createProduct(productType type) {
switch (type) {
case TypeA:
return new ProductA();
case TypeB:
return new ProductB();
case TypeC:
return new ProductC();
default:
return nullptr;
}
}
};
上面的代码示例是一个典型的工厂模式(Factory Pattern)实现,这是一种用于创建对象的设计模式,其目的是使用一个创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。
组件详解
productType
枚举:- 定义了三种产品类型:
TypeA
、TypeB
、TypeC
。这些类型用来指定工厂应该创建哪种具体的产品。
- 定义了三种产品类型:
抽象基类
Product
:- 这是一个抽象类,定义了所有具体产品类必须实现的接口(方法)
show()
,该方法用于显示产品的信息。 - 抽象基类还定义了一个纯虚析构函数,这是为了确保派生类的析构函数被调用,从而正确地管理内存和资源。
- 这是一个抽象类,定义了所有具体产品类必须实现的接口(方法)
具体产品类
ProductA
、ProductB
、ProductC
:- 这些类继承自
Product
抽象基类,并实现了show()
方法,分别打印不同的产品信息。 - 每个类都有自己的析构函数,用于在对象生命周期结束时进行清理。
- 这些类继承自
Factory
类:- 这个类包含一个重要的方法
createProduct(productType type)
,它根据传入的枚举类型参数来决定创建并返回哪种具体的产品对象。 - 通过这种方式,
Factory
类将产品的实例化逻辑封装起来,使得添加新产品时不需要修改调用方的代码。
- 这个类包含一个重要的方法
设计模式的优点
解耦:
- 工厂模式可以分离具体的类实例化过程,降低系统各部分间的依赖关系(耦合度)。
扩展性:
- 当需要添加新的产品类时,只需添加一个新的具体产品类并在工厂方法中增加一个新的分支即可,这样做符合开闭原则(对扩展开放,对修改封闭)。
隐藏创建细节:
- 用户只需要知道传递给工厂类一个参数,不需要知道具体的实现细节,就能得到一个产品对象。
使用场景
工厂模式非常适用于以下情况:
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由其子类来指定创建的对象时。
- 当类将创建对象的职责委托给多个帮助类中的某一个,并且你想将哪一个帮助类是代理者这一信息局部化时。
这种模式在软件开发中非常常见,尤其是在需要根据输入或配置生成不同对象时。它帮助将对象的创建和使用解耦,使系统更易于扩展和维护。
在你提供的C++代码片段中,有一个typedef
和一个枚举(enum
)类型的定义。这里我们可以分析下面几个方面:
1. typedef
关键字
typedef
是一个C和C++语言中用来给数据类型创建一个新名字的关键字。使用 typedef
可以给复杂的数据类型起一个更简单或更具描述性的名字,从而使代码更易读和易管理。
2. 枚举类型定义(enum
)
枚举(Enumeration)是一个用户定义的类型,它由一组命名的整数常量组成。枚举是用来表达程序中一个变量可能有的一组固定的值。在C++中,枚举还可以有类型安全性,因为枚举不会自动转换为整数(除非显式指定)。
3. 具体代码解析
typedef enum productType {
TypeA,
TypeB,
TypeC
} productTypeTag;
enum productType { ... }
:- 这是一个枚举类型的声明,枚举名为
productType
。 - 它定义了三个可能的值:
TypeA
,TypeB
, 和TypeC
。这些值在程序中代表不同的产品类型,通常它们会有默认的整数值,从0开始递增。即TypeA
默认为0,TypeB
为1,TypeC
为2。
- 这是一个枚举类型的声明,枚举名为
productTypeTag
:productTypeTag
是使用typedef
给enum productType
定义的新名字。在C++中,这使得productTypeTag
成为一个新的数据类型名,可以用于声明变量或函数参数等。- 使用
productTypeTag
作为变量的类型时,这个变量可以存储TypeA
、TypeB
或TypeC
中的一个值。
命名规则
枚举类型名(
productType
):- 通常以小写字母开头,使用驼峰式大小写(CamelCase)来增强可读性,尽管这不是强制的,各种编程团队可能有自己的命名约定。
枚举值(
TypeA
,TypeB
,TypeC
):- 以大写字母开头,同样使用驼峰式大小写。这种方式在枚举值中很常见,因为它们代表常量。
通过
typedef
定义的类型名(productTypeTag
):- 通常会使用后缀
Tag
来表示这是一个类型标签,这是一种命名习惯,可以帮助开发者迅速识别这是一个通过typedef
定义的类型名。
- 通常会使用后缀
这种命名方式有助于代码的清晰性和可维护性,使得代码中的数据类型和变量用途更加明确。