作笔记使用,如有写的不好或者不够精妙的,还请指正!!如果觉得有帮助也可以三连一波,多谢!
代码:
#include<iostream>
using namespace std;
/*
工厂方法模式
1.构建产品基类,派生类重写基类虚函数实现具体产品的功能
2.构建工厂基类,派生类重写基类虚函数实现生产不同产品
3.客户端代码直接生成对应的工厂类,然后调用工厂类的方法生成产品
*/
class Caculator {
public:
virtual int caculate(int a, int b) = 0; // 设为纯虚函数,子类必须重写
};
class Add : public Caculator {
public:
int caculate(int a, int b) {
return a + b;
}
};
class Minus : public Caculator {
public:
int caculate(int a, int b) {
return a - b;
}
};
class Multiply : public Caculator {
public:
int caculate(int a, int b) {
return a * b;
}
};
class Divide : public Caculator {
public:
int caculate(int a, int b) {
return a / b;
}
};
class Factory {
public:
virtual Factory* create_factory() = 0;
};
class AddFactory {
public:
Caculator* create_factory() {
return new Add();
}
};
class MinusFactory {
public:
Caculator* create_factory() {
return new Minus();
}
};
class MultiplyFactory {
public:
Caculator* create_factory() {
return new Multiply();
}
};
class DivideFactory {
public:
Caculator* create_factory() {
return new Divide();
}
};
int main() {
AddFactory addFactory;
Caculator* add = addFactory.create_factory();
cout << add->caculate(1,3) << endl;
delete add;
return 0;
}
对于三种工厂的个人见解:
-
简单工厂模式简单工厂C++实现https://blog.csdn.net/weixin_44178960/article/details/126064298?spm=1001.2014.3001.5502
-
一个产品基类,然后派生出不同的产品类,最后由工厂类根据用户的需求决定创建哪一个产品的类实例
-
特点:工厂类非抽象类,是一个包含创建产品方法的创造类;创建类实例的方法是静态的,也成为静态工厂
-
优点:本着高内聚低耦合的原则,将系统的逻辑部分和功能分开,结构简单,由工厂类统一负责产品类实例的创建
-
缺点:不易扩展,增加产品类需要修改工厂类的方法;不同的产品需要不同额外参数的时候不支持
-
-
工厂方法模式
-
一个产品基类和一个工厂基类,他们下面有相互对应的产品类和工厂类,由工厂类来决定实例化哪一个产品类
-
特点:
-
相比于简单工厂方法,加入了开放封闭原则,扩展性更强,耦合度更低,将简单工厂内部的逻辑判断转移到客户端代码进行,对工厂类进一步抽象,由具体的工厂类实现产品的实例化,增加产品类只需要增加对应的工厂类,不用去工厂类的方法里修改代码;
-
消费者跟产品类完全无关,只需要通过工厂接口来实现产品实例化
-
-
适用场景:用户知道所需创建对象的类,但不关心如何创建的时候
-
-
抽象工厂模式抽象工厂C++实现https://blog.csdn.net/weixin_44178960/article/details/126066536?spm=1001.2014.3001.5502
-
给客户端提供一个接口,创建不同产品族中的不同产品,不同产品抽象类和具体产品类,一个抽象工厂类,里面声明不同产品生产的虚函数,不同系列的产品工厂类实现具体的产品实例创建接口
-
特点:
-
一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建);
-
产品族扩展非常困难,要增加一个系列的某一产品,既要修改工厂抽象类里加代码,又修改具体的实现类里面加代码;
-
-
适用场景:相关的产品对象有不同的系列族时
-
溜了溜了~~~