软件里的简单工厂模式

        软件中,有时需要将对象的创建与使用分离,这时就需要简单工厂模式了。
        一、简单工厂模式的三个角色
        1)工厂(Factory)角色: 简单工厂模式的核心,它负责实现创建所有的实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
        2)抽象产品(AbstractProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
        3)具体产品(Concrete Product)角色:简单工厂模式所创建的具体实例对象。
在这里插入图片描述

图(1) 简单工厂模式的UML图

        二、适用场景
        1)工厂类负责创建的对象比较少,由于创建的对象比较少,不会造成工厂方法中的业务逻辑太过复杂。
        2)客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
        三、工厂模式的优缺点
        1)优点
        1.1) 实现了对象创建和使用的分离;
        1.2) 不需要记住具体类名,记住参数即可,减少使用者的记忆负担。
        2) 缺点:
        2.1)对工厂类职责过重,一旦不能工作,系统受到影响;
        2.2)增加系统中类的个数,复杂度和理解度增加;
        2.3)违反"开闭原则",添加新产品需要修改工厂逻辑,工厂越来越复杂。
        四、案例
在这里插入图片描述

图(2) 水果类的简单工厂模式UML图

        4.1 原设计 ver1.1

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
using namespace std;

class Fruit
{
    
    
public:
	Fruit(string kind){
    
    
		if (this->kind == "apple")
		{
    
    

		}
		else if (this->kind == "banana")
		{
    
    

		}
	}

	void getName(){
    
    
		if (this->kind == "apple")
		{
    
    
			cout << "I am apple" << endl;
		}
		else if (this->kind == "banana")
		{
    
    
			cout << "I am banana" << endl;
		}
	}

private:
	string kind;  //水果的种类
};

//工厂模式的目的,就是让业务层和类的构造函数之间解耦合,
//尽量降低一个类的复杂度

int main(void)
{
    
    
	//要一个苹果
	Fruit apple("apple");
	apple.getName();

	Fruit banana("banana");
	banana.getName();

	return 0;
}

4.2)加入了简单工厂模式的设计 ver1.2

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
using namespace std;


//水果类
class Fruit
{
    
    
public:
	virtual void getName() = 0;
};

class Apple :public Fruit
{
    
    
public:
	virtual void getName(){
    
    
		cout << "apple..." << endl;
	}
};

class Banana :public Fruit
{
    
    
public:
	virtual void getName(){
    
    
		cout << "banana..." << endl;
	}
};

//一个工厂
class Factory
{
    
    
public:
	//水果的生产器
	Fruit* createFruit(string kind){
    
    
		if (kind == "apple")
		{
    
    
			return new Apple;
		}
		else if (kind == "banana")
		{
    
    
			return new Banana;
		}
	}

};

int main(void)
{
    
    
	Factory *factory = new Factory;

	//要一个苹果
	Fruit *apple = factory->createFruit("apple");
	apple->getName();

	//要香蕉
	Fruit *banana = factory->createFruit("banana");
	banana->getName();

	return 0;
}

        版本ver1.2 比ver1.1代码的可维护性、可扩展性要好。

猜你喜欢

转载自blog.csdn.net/sanqima/article/details/105329092