C++设计模式 --1.工厂模式和单例模式

1.工厂模式

简单工厂模式

抽象产品类

//定义一个抽象水果类 --抽象产品角色
class AbstractFruit
{
   
   
public:
	virtual void showFruitName()=0;//抽取出产品的公共行为, 纯虚函数
    virtual ~AbstractFruit(){
   
   };//虚析构函数  -- 做为顶层基类,一定要显示定义虚析构函数,防止内存溢出
};

具体产品类

//苹果类 -- 具体产品角色
class Apple : public AbstractFruit
{
   
   
public:
	virtual void showFruitName() override {
   
   
		cout << "this is an apple" <<endl;
	}
};

//鸭梨类 -- 具体产品角色
class Pear : public AbstractFruit
{
   
   
public:
	virtual void showFruitName() override {
   
   
		cout << "this is a pear" <<endl;
	}
};

//香蕉类 -- 具体产品角色
class Banana : public AbstractFruit
{
   
   
public:
	virtual void showFruitName() override {
   
   
		cout << "create bananas" <<endl;
	}
};

工厂

//工厂类 --工厂角色
/*
	1.内含一个生成具体产品对象的静态方法,根据传入的参数判断要生成的哪种产品,并返回对象指针
	2.通过抽象产品类类型指针来接收具体产品的堆内存地址,达到多态目的。
*/
class FruitFactory
{
   
   
public:
	static AbstractFruit* makeFruit(string fruitType){
   
   
		if(fruitType == "apple"){
   
   
			return new Apple;
		}else if(fruitType == "pear") {
   
   
			return new Pear;
		}else if(fruitType == "banana") {
   
   
			return new Banana;
		}else {
   
   
			return nullptr;
		}
	}
};

客户端

//客户端
/*
  1.通过工厂类调用其创建产品的静态方法,并根据传入的参数 生成具体的产品对象
*/
int main(int argc, char *argv[])
{
   
   
	AbstractFruit* fruit = FruitFactory::makeFruit("apple");
	if(fruit != nullptr)
		fruit->showFruitName();
	delete fruit;
	cout << "==============" <<endl;
	fruit = FruitFactory::makeFruit("banana");
	if (fruit != nullptr)
		fruit->showFruitName();
	delete fruit;
	return 0;
}

在这里插入图片描述
简单工厂模式不属于 GoF的23种设计模式。
简单工厂模式 有以下三种角色:
抽象产品角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品角色:简单工厂模式所创建的具体实例对象。
工厂角色:简单工厂模式的核心,它负责创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象。

优点
1.实现客户端和具体实现类解耦;不需要关注对象的创建细节;
2.通过客户端 传入参数 让工厂知道应该创建什么类型对象。
缺点
1.当每增加新类型的具体产品时,需要修改工厂类的中if…else 源代码,不符合开闭原则。
2.这个类过重(很多if…else,及负责生成所有产品),将各种产品对象的初始化集中在一个类中实现,违反了 单一职责原则;
3.并且这个类发生问题,会影响很多使用这个工厂的模块。

简单工厂模式 UML类图:
在这里插入图片描述

工厂方法模式

工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统不修改具体工厂角色的情况下引进新的产品。

工厂方法模式是 简单工厂模式 + 开闭原则 +单一职责原则。
工厂方法模式有以下四个角色:
1.抽象工厂角色:工厂方法模式的核心,负责定义公共接口,任何具体工厂类都必须实现这个接口。
2.具体工厂角色:具体工厂是抽象工厂的一个实现,负责实例化产品对象。
3.抽象产品角色:工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
4.具体产品角色:工厂方法模式所创建的具体实例对象。
工厂方法模式的优点:

  1. 符合开闭原则,即抽象工厂中的公共接口是闭的,针对新种类产品,可以通过增加具体工厂来生产,这个是开的,实现可扩展。
  2. 符合单一职责原则,即每个具体工厂只负责生产某一种类的产品。而不像简单工厂模式中在 工厂类中负责生成所有种类产品。
    工厂方法模式的缺点:
  3. 类的成本个数增加,导致类越来越多,增加维护成本。

代码案例:
抽象工厂

//抽象水果工厂
class AbstractFruitFactory
{
   
   
public:
	virtual AbstractFruit* makeFruit() = 0;//生产水果的纯虚函数(也叫接口)
	virtual ~AbstractFruitFactory(){
   
   };
};

具体工厂

//负责具体生产苹果的苹果工厂
class AppleFactory : public AbstractFruitFactory
{
   
   
public:
	AbstractFruit* makeFruit() //实现接口
	{
   
   
		return 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值