设计模式(2)--对象创建(3)--工厂方法
2023-12-13 10:37:01
1. 意图
? ? 定义一个用于创建对象的接口,让子类决定实例化哪一个类。
? ? 工厂方法使一个类的实例化延迟到其子类。
2. 四种角色
? ? 抽象产品、具体产品、抽象构造者、具体构造者
3. 优点
? ? 3.1 仅处理抽象产品(Product)接口
? ? 3.2 给子类一个钩子(hook)以提供对象的扩展版本(父类有个缺省版本)
? ? 3.3 可以连接平行的类层次(职责委托)
4. 缺点
? ? 4.1 可能为了创建一个特定的具体产品对象,不得不创建一个具体构造者。
5. 相关模式
? ? 5.1 抽象工厂经常用工厂方法来实现
? ? 5.2 工厂方法通常在模板方法中被调用
? ? 5.3 原型不需要创建Creator子类,但需要Creator初始化产品对象,工厂方法则不需要。
6. 代码示意(C++)
#pragma once
#include <iostream>
using namespace std;
class Product
{
public:
virtual void Operation1() = 0;
virtual void Operation2() = 0;
};
class ConcreteProduct1 : public Product
{
public:
virtual void Operation1() {
cout << "ConcreteProduct1:操作1" << endl;
}
virtual void Operation2() {
cout << "ConcreteProduct1:操作2" << endl;
}
};
class ConcreteProduct2 : public Product
{
public:
virtual void Operation1() {
cout << "ConcreteProduct2:操作1" << endl;
}
virtual void Operation2() {
cout << "ConcreteProduct2:操作2" << endl;
}
};
class Creator
{
public:
void Operation1()
{
Product* pProduct = FactoryMethod();
pProduct->Operation1();
delete pProduct;
}
void Operation2()
{
Product* pProduct = FactoryMethod();
pProduct->Operation2();
delete pProduct;
}
public:
virtual Product* FactoryMethod() = 0;
};
class ConcreteCreator1 : public Creator
{
public:
virtual Product* FactoryMethod() {
return new ConcreteProduct1;
}
};
class ConcreteCreator2 : public Creator
{
public:
virtual Product* FactoryMethod() {
return new ConcreteProduct2;
}
};
#include "Creator.h"
int main() {
Creator* pCreator = new ConcreteCreator1;
Product* pProduct = pCreator->FactoryMethod();
pProduct->Operation1();
pProduct->Operation2();
delete pProduct;
delete pCreator;
pCreator = new ConcreteCreator2;
pCreator->Operation1();
pCreator->Operation2();
delete pCreator;
return 0;
}
运行结果:
6.1 可以直接操作Product的接口(3.1),也可以通过Creator操作
6.2 增加ConcreteProduct3,需要增加对应的ConcreteCreator3(4.1)
文章来源:https://blog.csdn.net/myepicure/article/details/134777239
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!