1.简单工厂模式
优点:客户端与实现类解耦;创建过程复杂的类,我们不用考虑内部情况
缺点:增加新功能会修改源码,不符合开闭原则;职责过重,出现问题,影响很多使用这个工厂的模块
//抽象类
class AbstractFriut {
public:
virtual void showName() = 0;
};
class Apple :public AbstractFriut {
public:
virtual void showName() {
cout <<"我是苹果" << endl;
}
};
class FriutFactory {
public:
//工厂创建对象
static AbstractFriut* createFactory(string name) {
if (name == "apple") {
return new Apple;
}
}
};
void test() {
FriutFactory* friutFactory = new FriutFactory;
AbstractFriut* friut = friutFactory->createFactory("apple");
friut->showName();
delete friut;
delete friutFactory;
}
2.工厂模式
定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。
让简单工厂的工厂抽象出来就符合开闭原则,每个具体类对应一个具体工厂
缺点:类的个数成倍增加,类越来越多,增加维护成本
优点:对象的创建于使用分离,扩展性变好
//抽象工厂类
class AbstractFactory {
public:
virtual AbstractFriut* createFactory() = 0;
};
//具体工厂类
class AppleFactory :public AbstractFactory {
public:
virtual AbstractFriut* createFactory() {
return new Apple;
}
};
class PearFactory :public AbstractFactory {
public:
virtual AbstractFriut* createFactory() {
return new Pear;
}
};
void test(){
AbstractFactory* absFactory = nullptr;
AbstractFriut* absFriut = nullptr;
absFactory = new AppleFactory;
absFriut = absFactory->createFactory();
absFriut->showName();
delete absFactory;
delete absFriut;
absFactory = new PearFactory;
absFriut = absFactory->createFactory();
absFriut->showName();
delete absFactory;
delete absFriut;
}
3.抽象工厂模式
定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类。
产品族:同一类的不同功能
产品等级:不同类的同一功能
抽象工厂针对产品族;产品族修改时,抽象工厂不符合开闭原则,产品等级修改时,符合开闭原则