前言
本文只是记录本人学习设计模式时记录的一些学习笔记,可能不全,但是可以做到一些提醒记忆的作用,如有侵权,联系删改,文章后会贴出学习时参考的链接。此前言适用于本人所写设计模式系列。
工厂方法
定义一个用于创建产品的接口,由子类决定生产什么产品
坏处: 加一个类,需要加一个工厂,类的个数成倍增加,增加维护成本,增加系统抽象性和理解难度
好处: 符合开闭原则
“简单工厂模式" + “开闭原则” = 工厂方法
结构:
-
抽象工厂(Creator)角色
工厂方法模式的核心,任何工厂类都必须实现这个接口。 -
具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化产品对象 -
抽象(Product)角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口 -
具体产品(Concrete Product)角色
工厂方法模式所创建的具体实例对象
示例:
将工厂类也进行抽象,不同的水果由不同的工厂生产,需要增加水果时,只需要增加水果类和工厂类即可,原有的工厂对象不需要进行任何修改
#include <iostream>
using namespace std;
class AbstractFruit{
public:
virtual void ShowName() = 0;
virtual ~AbstractFruit(){};
};
class Apple : public AbstractFruit{
virtual void ShowName()override{
cout << "I am Apple!" << endl;
}
};
class Banana : public AbstractFruit{
virtual void ShowName()override{
cout << "I am Banana!" << endl;
}
};
class Pear : public AbstractFruit{
virtual void ShowName()override{
cout << "I am Pear!" << endl;
}
};
class AbstractFruitFactory{
public:
virtual AbstractFruit* CreateFruit() = 0;
virtual ~AbstractFruitFactory(){};
};
class BananaFactory : public AbstractFruitFactory{
public:
virtual AbstractFruit* CreateFruit(){
return new Banana;
}
};
class AppleFactory : public AbstractFruitFactory{
public:
virtual AbstractFruit* CreateFruit(){
return new Apple;
}
};
class PearFactory : public AbstractFruitFactory{
public:
virtual AbstractFruit* CreateFruit(){
return new Pear;
}
};
int main()
{
AbstractFruitFactory* factory = NULL;
AbstractFruit* fruit = NULL;
factory = new AppleFactory;
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;
return 0;
}
将简单工厂的class FruitFactory
抽象成class BananaFactory
class AppleFactory
class PearFactory
,各个类分别实现CreateFruit()
,符合开闭原则;
参考: