设计模式——工厂方法

设计模式——工厂方法

  (1)目的:可以在不改动核心代码的情况下,添加新的产品(易扩展),实现依赖倒置。将类的实例化延迟到其子类。

(2)如何实现: 

     1.创建一个产品类基类(Product),具体产品类(ConcreteProduct)继承于产品类。

     2.创建一个抽象工厂类(Creator),具体的工厂(ConcreteCreator)继承于Creator,抽象工厂类定义一个虚函数接口,具体工厂类重写这个接口在接口内创建具体产品类。

(3)优点:

    1.扩展类的功能是不需要修改已有代码,完全实现了开放-封闭原则。

(4)缺点:

   1.没当新增一个新产品时,要在具体工厂类和具体产品类中各新增一个类,开发量较大。

   2.具体实例化哪一个类交给客户端去判断。


│  add_factory.cpp
│  add_factory.h
│  add_operation.cpp
│  add_operation.h
│  calculate_factory.cpp
│  calculate_factory.h
│  main.cpp
│  multiply_factory.cpp
│  multiply_factory.h
│  multiply_operation.cpp
│  multiply_operation.h
│  operation_factory.cpp
│  operation_factory.h

operation_factory.h(Product)

#pragma once
class OperationFactory
{
public:
	int a;
	int b;
public:
	OperationFactory() = default;
	OperationFactory(int, int);
	int virtual GetResult()=0;
};

operation_factory.cpp

#include "operation_factory.h"
OperationFactory::OperationFactory(int num1, int num2)
{
	a = num1;
	b = num2;
}

add_operation.h(ConcreteProduct)

#include "operation_factory.h"
class AddOperation :
    public OperationFactory
{
public:
    AddOperation() = default;
    AddOperation(int, int);
    int GetResult() override;
};

add_operation.cpp

#include "add_operation.h"
AddOperation::AddOperation(int num1, int  num2)
{
	a = num1;
	b = num2;
}
int AddOperation::GetResult()
{
	return a + b;
}

multiply_operation.h(ConcreteProduct)

#pragma once
#include "operation_factory.h"
class MultiplyOperation :
    public OperationFactory
{
public:
    MultiplyOperation() = default;
    MultiplyOperation(int, int);
    int GetResult() override;
};

multiply_operation.cpp

#include "multiply_operation.h"
MultiplyOperation::MultiplyOperation(int num1, int  num2)
{
	a = num1;
	b = num2;
}
int MultiplyOperation::GetResult()
{
	return a * b;
}

calculate_factory.h(Creator)

#pragma once
#include "operation_factory.h"
class CalculateFactory
{
	public:
	virtual OperationFactory* GetSpecificOperation(int,int) = 0;
};

calculate_factory.cpp

#include "calculate_factory.h"

add_factory.h(ConcreteCreator)

#pragma once
#include "calculate_factory.h"
#include "add_operation.h"
class AddFactory :
    public CalculateFactory
{
    public:
    OperationFactory* GetSpecificOperation(int,int) override;
};

add_factory.cpp

#include "add_factory.h"
OperationFactory* AddFactory::GetSpecificOperation(int num1,int num2)
{
	return new AddOperation(num1, num2);
}

 multiply_factory.h(ConcreteCreator)

#pragma once
#include "calculate_factory.h"
class MultiplyFactory :
    public CalculateFactory
{
    public:
    OperationFactory* GetSpecificOperation(int, int) override;
};

multiply_operation.cpp

#include "multiply_factory.h"
#include "multiply_operation.h"
OperationFactory* MultiplyFactory::GetSpecificOperation(int num1, int num2)
{
	return new MultiplyOperation(num1, num2);
}

main.cpp(客户端)

#include<iostream>
#include "add_factory.h"
#include "multiply_factory.h"

int main()
{
    int num1 = 2;
    int num2 = 9;
    CalculateFactory* factory_add =new AddFactory();
    CalculateFactory* factory_mul = new MultiplyFactory();
    OperationFactory* plus = factory_add->GetSpecificOperation(num1, num2);
    OperationFactory* mul = factory_mul->GetSpecificOperation(num1, num2);
    std::cout << plus->GetResult() << std::endl;
    std::cout << mul->GetResult() << std::endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值