简单工厂模式:需要在工厂类中做判断,从而创造相应的产品
缺点:在增加新的核类型时,需要修改工厂类。违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。
工厂方法:是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
代码如下:
头文件SimpleFactoryModel.h
#pragma once
#include<iostream>
using namespace std;
enum PHONENAME {IPHONE, HUAWEI, XIAOMI};
class SmartPhone {
int price = 0;
public:
//string name;
int GetPrice() {
return price;
}
void SetPrice(int price) {
this->price = price;
}
virtual void PrintPrice() = 0;
};
class IPhone : public SmartPhone{
void PrintPrice() {
cout << "IPhone Price is " << GetPrice() << endl;
}
};
class HuaWei : public SmartPhone {
void PrintPrice() {
cout << "HuaWei Price is " << GetPrice() << endl;
}
};
class XiaoMi : public SmartPhone {
void PrintPrice() {
cout << "XiaoMi Price is " << GetPrice() << endl;
}
};
class PhoneFactory {
public:
SmartPhone* CreatPhone(PHONENAME name);
};
class PhoneFactoryUP{
public:
virtual SmartPhone* CreatPhoneUP() = 0;
};
SmartPhone* PhoneFactory::CreatPhone(PHONENAME name) {
switch (name) {
case IPHONE:
return new IPhone();
case HUAWEI:
return new HuaWei();
case XIAOMI:
return new XiaoMi();
}
}
class IPhoneFactory: public PhoneFactoryUP {
public:
SmartPhone* CreatPhoneUP() {
return new IPhone();
}
};
class HuaWeiFactory : public PhoneFactoryUP {
public:
SmartPhone* CreatPhoneUP() {
return new HuaWei();
}
};
class XiaoMiFactory : public PhoneFactoryUP {
public:
SmartPhone* CreatPhoneUP() {
return new XiaoMi();
}
};
主函数测试代码main.cpp
#include<iostream>
#include"SimpleFactoryModel.h"
using namespace std;
int main() {
/*
简单工厂模式:需要在工厂类中做判断,从而创造相应的产品
缺点:在增加新的核类型时,需要修改工厂类。违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。
*/
PhoneFactory *pf = new PhoneFactory();
SmartPhone *sp = pf->CreatPhone(IPHONE);
sp->SetPrice(7000);
sp->PrintPrice();
sp = pf->CreatPhone(HUAWEI);
sp->SetPrice(6000);
sp->PrintPrice();
sp = pf->CreatPhone(XIAOMI);
sp->SetPrice(3000);
sp->PrintPrice();
/*
工厂方法:是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
缺点:需要更多的类定义
*/
SmartPhone* psp = (new IPhoneFactory())->CreatPhoneUP();
psp->SetPrice(8000);
psp->PrintPrice();
return 0;
}