C++设计模式-工厂模式实现

简单工厂模式:需要在工厂类中做判断,从而创造相应的产品
缺点:在增加新的核类型时,需要修改工厂类。违反了开放封闭原则:软件实体(类、模块、函数)可以扩展,但是不可修改。
工厂方法:是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值