1、客户端与具体实现类解耦。
2、对于某些创建对象的过程比较复杂的情况。只需给工厂传参,然后工厂根据传入的参数返回对象,无需了解对象创建的具体过程。
代码示例
// 抽象水果类
class AbstractFruit
{
public:
virtual void showName() = 0;
};
// 具体水果
class Apple : public AbstractFruit
{
public:
virtual void showName() {
cout << "我是苹果!" << endl;
}
};
class Banana : public AbstractFruit
{
public:
virtual void showName() {
cout << "我是香蕉!" << endl;
}
};
class Pear : public AbstractFruit
{
public:
virtual void showName() {
cout << "我是大鸭梨!" << endl;
}
};
// 水果工厂
class FruitFactory
{
public:
static AbstractFruit* CreateFruit(string flag) {
if (flag == "apple") {
return new Apple;
}
else if (flag == "banana") {
return new Banana;
}
else if (flag == "pear") {
return new Pear;
}
else {
return NULL;
}
}
};
工厂的使用
void test01()
{
FruitFactory* factory = new FruitFactory();
AbstractFruit* fruit = factory->CreateFruit("apple");// 使用工厂创建对象
fruit->showName();
delete fruit;
fruit = factory->CreateFruit("banana");
fruit->showName();
delete fruit;
fruit = factory->CreateFruit("pear");
fruit->showName();
delete fruit;
delete factory;
}
应用场景:
1、工厂类负责创建的对象比较少,由于创建的对象比较少,不会造成工厂方法中业务逻辑太过复杂,不用频繁修改工厂类。
2、客户端只知道传入工厂的参数,对于如何创建对象并不关心。
缺点:
1、简单工厂模式在增加新功能时是通过修改源代码来实现的,这不符合开闭原则。
2、工厂类职责过重,不符合单一职责原则。
所以简单工厂模式并不在23种设计模式之列
简单工厂模式:
只需要创建一个工厂,通过传参给工厂返回不同的对象,用户不需要了解具体对象的创建过程,对象的创建都是工厂来完成的。
对于工厂类而言,如果要增加新的功能,就需要修改工厂类,这违背了开闭原则,除此之外,这个工厂类的职责太多,即要生产苹果,又要生产香蕉,还要生产梨,这违背了单一职责原则。
针对上述问题,进行改进。
·
// 抽象工厂
class AbstractFactory
{
public:
virtual AbstractFruit* CreateFruit() = 0;
};
// 苹果工厂
class AppleFactory : public AbstractFactory
{
public:
virtual AbstractFruit* CreateFruit() {
return new Apple;
}
};
// 香蕉工厂
class BananaFactory : public AbstractFactory
{
public:
virtual AbstractFruit* CreateFruit() {
return new Banana;
}
};
// 梨工厂
class PearFactory : public AbstractFactory
{
public:
virtual AbstractFruit* CreateFruit() {
return new Pear;
}
};
工厂的使用如下:
void test01()
{
AbstractFactory* factory = NULL;
factory = new AppleFactory();
AbstractFruit* fruit = factory->CreateFruit();
fruit->showName(); // 通过苹果工厂创建苹果对象
delete fruit;
delete factory;
factory = new BananaFactory();
fruit = factory->CreateFruit();
fruit->showName(); // 通过香蕉工厂创建香蕉对象
delete fruit;
delete factory;
factory = new PearFactory();
fruit = factory->CreateFruit();
fruit->showName(); // 通过大鸭梨工厂创建大鸭梨对象
delete fruit;
delete factory;
}
工厂方法模式:
通过将工厂抽象化,使对象的创建由专门的工厂创建,符合单一职责原则。
如果需要增加新的水果,则只需增加一个工厂类,不需要修改源代码,符合开闭原则。
优点:
1、不需要记住具体类名,甚至不需要记住传入参数,只需要知道生产所需对象的工厂就能得到新的对象。
2、实现了对象的创建和使用的分离。
3、系统的可扩展性变好,无需修改源类。
缺点:
1、增加了系统中类的个数,代码复杂度和理解难度加大。
2、增加了系统的抽象性。
总结:简单工厂模式 + 开闭原则 + 单一职责原则 = 工厂方法模式
工厂方法模式的使用场景:
1、客户端不知道所需对象的类。
2、抽象工厂类通过其子类来指定创建具体对象。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)