Abstract Factory Design Pattern 抽象工厂设计模式 - 总结

Abstract Factory Design Pattern 就是一般的Factory Design Pattern的进一步设计,增加一个抽象工厂,然后利用这个工厂可以创建不同基类的类。

当我们需要创建更多不同类的时候就可以使用这个设计模式了。

这个设计模式的代码相对会多点,但是其中的思想就是一般Factory Design Pattern,然后集合更多的基类,看起来挺大的一个设计模式,其思想是挺简单的。

其中具体的实现细节当然是可以有多种实现方法的:

1 利用Factory的基类衍生出不同的Factory,使用这些不同的Factory类创建不同基类的类对象,可以认为不同种类的对象。

2 利用一个Factory类,然后利用参数传递,根据不同的参数创建出不同的基类对象。 - 传递参数入类,或者传递参数进创建函数都是可以的。


最后,本博客已经写完了GOF的所有23中设计模式了,并给出了C++的具体可运行实现代码。

总结一下学设计模式的心得:

1 一定要自己用代码实现,可以由代码入手也是不错的选择,因为直接看GOF的书,的确是写得比较抽象的,但是有一定代码基础了,那么就可以把很多知识点连接起来了,会实现了,什么都会变得简单理解很多了。

2 不要过于拘泥于理论,记熟了也没什么用,主要还是应用为主吧,像本人的项目中,如今都已经有意识地在使用这些设计模式了,尤其是单一设计模式,builder设计模式,Factory设计模式等非常常用的设计模式,多用就有感觉了。当然也不能无视理论。

3 设计模式虽然给人感觉是高深莫测的,不过撕开了神秘面纱之后,一切都变得简单了,很多都是一些简单的算法的实现,算法其实是无处不在啊,说算法没什么用处的人,我敢说这些人99.999%的算法水平都不怎么样。


最后贴上Abstract Factory Design Pattern的代码:


#include <stdio.h>
#include <string>
using namespace std;

class Shape
{
public:
	virtual void getShape()
	{
		puts("Shape");
	}
};

class Cycle:public Shape
{
public:
	void getShape()
	{
		puts("Cycle");
	}
};

class Ellipse:public Shape
{
public:
	void getShape()
	{
		puts("Ellipse");
	}
};

class Car
{
public:
	virtual void getCar()
	{
		puts("Car");
	}
};

class Rolls_Royce:public Car
{
public:
	void getCar()
	{
		puts("Rolls-Royce");
	}
};

class Ford:public Car
{
public:
	void getCar()
	{
		puts("Ford");
	}
};

class Factory
{
public:
	Shape *createShape(string shape)
	{
		if (shape == "Cycle")
		{
			return new Cycle;
		}
		else if (shape == "Ellipse")
		{
			return new Ellipse;
		}
		return new Shape;
	}

	Car *createCar(string car)
	{
		if (car == "Rolls-Royce")
		{
			return new Rolls_Royce;
		}
		else if (car == "Ford")
		{
			return new Ford;
		}
		return new Car;
	}
};

class ShapeFactory : public Factory
{
public:
	Shape *createCycle()
	{
		return new Cycle;
	}
	Shape *createEllipse()
	{
		return new Ellipse;
	}
};

class CarFactory : public Factory
{
public:
	Car *createRolls_Royce()
	{
		return new Rolls_Royce;
	}

	Car *createFord()
	{
		return new Ford;
	}
};

int main()
{
	//使用一个工厂类对象可以创建不同的对象
	puts("Using one class to create all needed factory");
	Factory factory;
	Shape *shape = factory.createShape("Cycle");
	shape->getShape();
	delete shape;
	shape = factory.createShape("Ellipse");
	shape->getShape();
	delete shape;

	Car *car = factory.createCar("Rolls-Royce");
	car->getCar();
	delete car;
	car = factory.createCar("Ford");
	car->getCar();
	delete car;

	//使用不同的衍生类工厂创建不同的类对象测试
	puts("\nUse different factory class to create different objects");
	ShapeFactory *fac = new ShapeFactory;
	shape = fac->createCycle();
	shape->getShape();
	delete shape;
	shape = fac->createEllipse();
	shape->getShape();
	delete shape;
	delete fac;

	CarFactory *cf = new CarFactory;
	car = cf->createRolls_Royce();
	car->getCar();
	delete car;
	car = cf->createFord();
	car->getCar();
	delete car;
	delete cf;

	return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值