c++设计模式之(简单/抽象)工厂方法模式 学习笔记

我个人很喜欢根据模式的名字来记忆和了解它的方法。工厂方法模式其实就是:什么样的工厂生产什么样的东西。只不过对于编程而言,这些不同种类的工厂拥有一个共同的抽象的工厂基类,用的时候可以以工厂基类指针统一操作,比每种产品分别定义该类产品的指针来编程要方便许多。(说到底还是为了更方便的编程)
在说工厂方法模式之前,先介绍一下简单工厂模式。该模式不属于23种设计模式,但因为许多时候也经常被使用,所以通常和工厂方法模式结合在一起学习。
通俗的说,简单工厂模式就是只有一个工厂,该工厂可以生产各种种类的产品。直接上代码:

#include <iostream>
class Product
{

};
class ProductA :public Product
{

};
class ProductB :public Product
{

};
class ProductC :public Product
{

};
class EasyFactory
{
public:
	static Product* product(std::string name)
	{
		if (name == "A")
			return new ProductA;
		else if (name == "B")
			return new ProductB;
		else if (name == "C")
			return new ProductC;
		else
			return NULL;
	}
};

可以看到是不是非常方便,就像逛超市一样,你想买什么就买什么。但是对工厂来说,如果进行产品改善和扩展的话,就需要修改源代码,这是不符合开闭原则的。而且这个类出问题的话,牵一发动全身,所有的都可能会出问题,这是不允许的。

和简单工厂模式相对比,工厂方法模式是由一个工厂基类派生许多工厂类,这些工厂类分别生产不同种类的东西。简单来讲,就是各司其职,术业专攻,毕竟贪多嚼不烂。
直接上代码。

#include <iostream>
class Product
{

};
class ProductA :public Product
{

};
class ProductB :public Product
{

};
class ProductC :public Product
{

};
class Factory
{
public:
	virtual Product* product() = 0;

};
class FactoryA :public Factory
{
public:
	Product* product()
	{
		return new ProductA;
	}
};
class FactoryB :public Factory
{
public:
	Product* product()
	{
		return new ProductB;
	}
};
class FactoryC :public Factory
{
public:
	Product* product()
	{
		return new ProductC;
	}
};

最后顺便写一下抽象工厂模式。学习的时候看了许多关于抽象工厂模式和工厂模式的比对的博客,发现因为每个人思考问题的角度不同,所以对抽象工厂模式的描述的侧重点也不同。因为本人比较懒,所以不想去分类讨论二者的区别,只说一下代码最直观的区别——抽象工厂模式中,产品分为多个种类,每一种类都有一个抽象基类;工厂生产的产品不止一种,而是多个种类都各有一种。【而工厂方法模式中,产品只有一个种类,所以只有一个抽象基类;工厂生产的产品也只有一种】
直接上代码。

//产品A等级结构:1级,2级,3级
#include <iostream>
class ProductA
{

};
class ProductA1 :public ProductA
{

};
class ProductA2 :public ProductA
{

};
class ProductA3 :public ProductA
{

};
//产品B等级结构:1级,2级,3级
class ProductB
{

};
class ProductB1 :public ProductB
{

};
class ProductB2 :public ProductB
{

};
class ProductB3 :public ProductB
{

};
//产品C等级结构:1级,2级,3级
class ProductC
{

};
class ProductC1 :public ProductC
{

};
class ProductC2 :public ProductC
{

};
class ProductC3 :public ProductC
{

};
//抽象工厂,分别生成abc,针对的是产品族:A类,B类,C类
class Factory
{
public:
	virtual ProductA* product_a() = 0;
	virtual ProductB* product_b() = 0;
	virtual ProductC* product_c() = 0;

};
//工厂1生成1级别的类族产品abc
class FactoryOne :public Factory
{
public:
	ProductA* product_a()
	{
		return new ProductA1;
	}
	ProductB* product_b()
	{
		return new ProductB1;
	}
	ProductC* product_c()
	{
		return new ProductC1;
	}

};
//工厂2生成2级别的类族产品abc
class FactoryTwo :public Factory
{
public:
	ProductA* product_a()
	{
		return new ProductA2;
	}
	ProductB* product_b()
	{
		return new ProductB2;
	}
	ProductC* product_c()
	{
		return new ProductC2;
	}
};
//工厂3生成3级别的类族产品abc
class FactoryThree :public Factory
{
public:
	ProductA* product_a()
	{
		return new ProductA3;
	}
	ProductB* product_b()
	{
		return new ProductB3;
	}
	ProductC* product_c()
	{
		return new ProductC3;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值