UML和设计模式——简单工厂模式、工厂模式

简单工厂模式

简单工厂模式通过定义一个类来创建其他类的实例。但不是标准的设计模式

当需求发生变化时需要修改代码 不符合开闭原则

简单工厂模式分三种角色:
1.工厂角色
2.抽象角色
3.具体角色

在这里插入图片描述
抽象角色是具体角色的父类

#include<iostream>
using namespace std;
class Person
{
public:
	virtual void work() = 0;
};
class Student:public Person
{
public:
	virtual void work()
	{
		cout << "go to school" << endl;
	}
};
class Teacher :public Person
{
public:
	virtual void work()
	{
		cout << "teach students" << endl;
	}
};
class Factory
{
public:
	Person* getPerson(string type)
	{
		if (type == "student")
		{
			return new Student;
		}
		else if (type == "teacher")
		{
			return new Teacher;
		}
	}

};

int main()
{
	string type;
	Factory* f = new Factory;
	Person* p = nullptr;

	type = "student";
	p = f->getPerson(type);
	p->work();
	type = "teacher";
	p = f->getPerson(type);
	p->work();
	delete p;
	delete f;


	return 0;
}

工厂模式

符合开闭原则的工厂模式:
此时有新的需求只需要增加代码不需要修改代码
1.创建新的工厂继承于抽象工厂
2.创建新的产品继承于抽象产品
3.使用新的工厂创建新的产品

在这里插入图片描述

#include<iostream>
using namespace std;
class Fruit
{
public:
	virtual void sayname() = 0;
};
class Apple :public Fruit
{
public:
	virtual void sayname()
	{
		cout << "apple" << endl;
	}
};
class Orange :public Fruit
{
public:
	virtual void sayname()
	{
		cout << "orange" << endl;
	}
};

class AbsFactory
{
public:
	virtual Fruit* CreateFruit() = 0;
};
class AppleFactory:public AbsFactory
{
public:
	virtual Fruit* CreateFruit()
	{
		return new Apple;
	}
};
class OrangeFactory:public AbsFactory
{
public:
	virtual Fruit* CreateFruit()
	{
		return new Orange;
	}
};

//新增品种
class NewFruit:public Fruit
{
public:
	virtual void sayname()
	{

		cout << "NewFruit" << endl;
	}
};
class NewFactory:public AbsFactory
{
public:
	virtual Fruit* CreateFruit()
	{
		return new NewFruit;
	}
};


int main()
{
	Fruit* fruit = nullptr;
	AbsFactory* absf = nullptr;

	absf = new AppleFactory;
	fruit = absf->CreateFruit();
	fruit->sayname();

	delete absf;
	delete fruit;
	absf = nullptr;
	fruit = nullptr;

	absf = new OrangeFactory;
	fruit = absf->CreateFruit();
	fruit->sayname();

	delete absf;
	delete fruit;
	absf = nullptr;
	fruit = nullptr;

	absf = new NewFactory;
	fruit = absf->CreateFruit();
	fruit->sayname();


	delete absf;
	delete fruit;
	absf = nullptr;
	fruit = nullptr;

	return 0;
}

发布了7 篇原创文章 · 获赞 0 · 访问量 420
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章