简单工厂模式
简单工厂模式通过定义一个类来创建其他类的实例。但不是标准的设计模式
当需求发生变化时需要修改代码 不符合开闭原则
简单工厂模式分三种角色:
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;
}