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;
}

Abstract Factory Design Pattern 抽象工厂设计模式 - 总结,布布扣,bubuko.com

时间: 2024-10-23 09:33:45

Abstract Factory Design Pattern 抽象工厂设计模式 - 总结的相关文章

[Design Pattern] 抽象工厂模式

工厂方法模式 让一个具体的类对应一个工厂.然后把所有工厂进行抽象.通过抽象工厂实现具体的工厂来创建对象.如果需要新增一个类,那么就需要创建一个工厂类来创建对象 优点: 1. 符合开闭原则.是简单工厂改进 2. 实现创建和使用分离 缺点: 1. 类的个数庞大.增加一个具体对象类就需要增加一个对应工厂类.增加维护成本 参考代码: class Fruit { public: virtual void showName() = 0; }; class Apple : public Fruit { pub

抽象工厂设计模式

/** 抽象工厂设计模式:与工厂设计模式是一样的,只不过抽象工厂是多产品系的. 工厂模式是单产品系的. 一个生产汽车的工厂,生产TopCar.TopBus,MidCar.MidBus,LowCar.LowBus. 利用抽象设计模式的方法,提取共同的特征. 当产生第四个SuperCar()类的时候,只需要在原来代码上增添SuperCar类实现接口,创建工厂即可. 而不需要再更改原来的代码. */ interface ICar{ //System.out.println("定义一些生产汽车共有的方法

用C# (.NET Core) 实现抽象工厂设计模式

本文的概念性内容来自深入浅出设计模式一书. 上一篇文章讲了简单工厂和工厂方法设计模式 http://www.cnblogs.com/cgzl/p/8760250.html, 使用的是披萨店的例子. 文将继续使用这个例子, 这里要用到抽象工厂. 披萨店的需求变更 现在披萨店在各地授权了很多连锁分店, 但是有的分店偷工减料, 使用劣质原料代替标准原料. 披萨店老板现在就是想解决这个问题. 原料的一致性问题 首先如何保证原料的质量问题? 可以建立一个工厂生产原料, 然后把原料分发到各地的授权店. 然后

Design Pattern Prototype 原型设计模式

Prototype设计模式其实就是利用一个深拷贝的功能,在原有的类中,通过一个clone函数,创建一个新的类,并可以利用好原有的数据. 这样可以轻易clone出多个新的对象操作,而且都有各自的内存空间. #include <string> #include <iostream> using namespace std; class MultiData { protected: bool b; char c; string s; int a; public: virtual Mult

Flyweight Design Pattern 共享元设计模式

就是利用一个类来完成多种任务,不用每次都创建一个新类. 个人觉得这个设计模式在C++里面,好像可以就使用一个函数代替,利用反复调用这个函数完成任务和反复利用这个类,好像差不多. 不过既然是一个设计模式,那么就使用类来完成任务.而对于Java来说是不面向过程的,故此就必须使用这个设计模式了. 我这里设计一个仓库来保存这样的类,需要的时候反复取出来使用. 非常简单的设计模式: #include <stdio.h> class ReusedObject { public: ReusedObject(

Design Pattern Bridge 桥设计模式

桥设计模式其实就是一个简单的has a relationship,就是一个类拥有另一个类,并使用另一个类实现需要的功能. 比如遥控器和电视之间可以使用桥设计模式达到可以使用同一个遥控器控制多台电视机的目的. 这样的设计思想是多种设计模式反反复复使用基本思想. 仔细思考下会发现多种设计模式的底层思想其实是相通的,不过具体实现或者某些细节,应用等有那么一点差别罢了. 下面就实现一个TV和remoter类,其中的remoter是可以随时更换的. #include <stdio.h> class Re

design pattern Builder 建造者设计模式

其实设计模式可以学的很有意思的,不需要非得如此硬枯燥地去啃FOG的大部头,当然这些骨头啃啃也健康. 本文利用建造者模式设计一个有趣的场景,一个利用这个模式去学功夫的过程,呵呵. 首先设计一个基类,学功夫先要有基础嘛: class 功夫 { public: virtual void 看招() = 0; }; 有了基础之后,我们就可以学习高级功法了,这里学习降龙十八掌,O(∩_∩)O~. list<int>容器,相当于记录下来的武功招式了,记住这些招式之后就可以开始学习了.小宝曰:绝世武功这么厚,

Design Pattern Facade 门面设计模式

Facade设计模式主要作用是因为有个很难使用的类,然后要设计一个新类,整理好这个类,使得其更好使用. 比如有类如此: class MessyClass { char *name; public: MessyClass() : name(new char[3]) { for (int i = 0; i < 3; i++) { name[i] = ' '; } } ~MessyClass() { delete [] name; } void setFirstName(char a) { name[

Design Pattern Memo 备忘录设计模式

本设计模式就是简单地记录当前状态,然后利用记录的数据恢复. 比如首先我们有一个类,类需要记录当前状态进行相关的工作的: class Memo; class Human { public: string state; Memo *makeMemo(); void restroDataFromMemo(Memo *m); void show() { cout<<"State: "<<state<<endl; } }; 这里面的state可以是任意定义的数