C++设计模式之建造者模式(二)

3、省略指挥者Director的建造者模式

指挥者类Director在建造者模式中扮演非常重要的作用,简单的Director类用于指导具体建造者如何构建产品,它按一定次序调用Builder的buildPartX()方法,控制调用的先后次序,并向客户端返回一个完整的产品对象。Direcotr针对抽象的建造者进行编程,如果需要不同的建造者,只需把建造者传入指挥者类,无需修改之前的代码。

在有些情况下,为了简化系统结构,可以省略指挥者Director,指挥者不再指导产品的创建过程。而是在Builder中提供逐步构建复杂产品对象的construct()方法。

暴风影音播放器是具体的产品,实现代码和上一篇博客一样,这里就不再呈现。有变化的是建造者类,播放模式.h头文件实现代码如下:

#ifndef _PLAY_PATTERN_H_
#define _PLAY_PATTERN_H_
#include <iostream>
#include <string>
#include "Player.h"
using namespace std;

//抽象播放模式
class PlayPattern
{
protected:
	//具体产品(播放器)
	Player * m_pPlayer;
public:
	PlayPattern()
	{
		m_pPlayer = new Player();
	}

	~PlayPattern()
	{
		if( NULL != m_pPlayer )
		{
			delete m_pPlayer;

			m_pPlayer = NULL;
		}
	}

	//制造播放窗口
	virtual void BuildWindow() = 0;

	//制造播放菜单
	virtual void BuildMenu() = 0;

	//制造播放列表
	virtual void BuildPlayList() = 0;

	//制造播放进度条
	virtual void BuildControlBar() = 0;

	//制造收藏列表
	virtual void BuildCollectList() = 0;

	//开始建造,封装建造过程
	Player * StartConstruct()
	{
		BuildWindow();
		BuildMenu();
		BuildPlayList();
		BuildControlBar();
		BuildCollectList();

		return m_pPlayer;
	}
};

//完整播放模式
class FullPattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};

//精简播放模式
class SimplePattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};

//记忆播放模式
class MemoryPattern : public PlayPattern
{
public:
	void BuildWindow();
	void BuildMenu();
	void BuildPlayList();
	void BuildControlBar();
	void BuildCollectList();
};

#endif

指导者类不再指导暴风影音产品对象的创建过程,而是由抽象播放器模式StartConstruct方法来封装播放器产品的创建过程。

播放模式Cpp文件代码如下:

#include "PlayPattern.h"

//制造播放窗口
void FullPattern::BuildWindow()
{
	m_pPlayer->SetWindow("主界面窗口");
}

//制造播放菜单
void FullPattern::BuildMenu()
{
	m_pPlayer->SetMenu("主菜单");
}

//制造播放列表
void FullPattern::BuildPlayList()
{
	m_pPlayer->SetPlayList("播放列表");
}

//制造播放进度条
void FullPattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("进度条");
}

//制造收藏列表,完整播放模式没有收藏列表,内容设为空
void FullPattern::BuildCollectList()
{
	m_pPlayer->SetCollectList(" ");
}

////////////////精简模式///////////////////////////////

void SimplePattern::BuildWindow()
{
	m_pPlayer->SetWindow("主界面窗口");
}

void SimplePattern::BuildMenu()
{
	m_pPlayer->SetMenu(" ");
}

void SimplePattern::BuildPlayList()
{
	m_pPlayer->SetPlayList(" ");
}

void SimplePattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("进度条");
}

void SimplePattern::BuildCollectList()
{
	m_pPlayer->SetCollectList(" ");
}

/////////////////记忆模式////////////////////////////////

void MemoryPattern::BuildWindow()
{
	m_pPlayer->SetWindow("主界面窗口");
}

void MemoryPattern::BuildMenu()
{
	m_pPlayer->SetMenu(" ");
}

void MemoryPattern::BuildPlayList()
{
	m_pPlayer->SetPlayList(" ");
}

void MemoryPattern::BuildControlBar()
{
	m_pPlayer->SetControlBar("进度条");
}

void MemoryPattern::BuildCollectList()
{
	m_pPlayer->SetCollectList("收藏列表");
}

完整播放模式下并不需要建造收藏列表部件,因此把收藏列表的内容设为空,其它情况类型,把不需要建造的部件内容设为空。测试程序实现代码如下:

#include <iostream>
#include "PlayPattern.h"
#include "Player.h"

using namespace std;

int main()
{
	Player * pPlayer = NULL;

	/***********************完整播放模式************************/
	PlayPattern * pFullPattern = new FullPattern();
	cout << "完整播放模式:" << endl;
	pPlayer = pFullPattern->StartConstruct();
	pPlayer->Display();

 	/***********************精简播放模式************************/
	SimplePattern * pSimplePattern = new SimplePattern();
	cout << "精简播放模式:" << endl;
	pPlayer = pSimplePattern->StartConstruct();
	pPlayer->Display();

 	/***********************记忆播放模式************************/
	MemoryPattern * pMemoryPattern = new MemoryPattern();
	cout << "记忆播放模式:" << endl;
	pPlayer = pMemoryPattern->StartConstruct();
	pPlayer->Display();

	/***********************销毁操作****************************/
	cout << endl;
	delete pFullPattern;
	pFullPattern = NULL;

	delete pSimplePattern;
	pSimplePattern = NULL;

	delete pMemoryPattern;
	pMemoryPattern = NULL;

	return 0;
}

编译并执行,结果如下:

此时,StartConstruct()方法定义了其他buildPartX()方法调用的次序,为其他方法的执行提供了一个流程模板,这与我们在后面要学习的模板方法模式非常类似。对Director类的省略方式都不影响系统的灵活性和可扩展性,同时还简化了系统结构,但加重了抽象建造者类的职责,如果StartConstruct()方法较为复杂,待构建产品的组成部分较多,建议还是将StartConstruct()方法单独封装在Director中,这样做更符合“单一职责原则”

C++设计模式之建造者模式(二),布布扣,bubuko.com

时间: 08-17

C++设计模式之建造者模式(二)的相关文章

Java经典23种设计模式之创造型模式(二)

本文记录5种创造型模式的剩下两种:建造者模式(Builder).原型模式(PROTOTYPE). 一.建造者模式(别名:生成者模式) 将复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示.一个完整的建造者模式包含以下几个概念: 1.产品类 Product public class Person { private String head; private String body; private String foot; public String getHead() { ret

浅析JAVA设计模式之工厂模式(二)

1 工厂方法模式简介 工厂方法 (Factroy Method) 模式:又称多态性工厂模式(Polymorphic Factory),在这种模式中,核心工厂不再是一个具体的类,而是一个抽象工厂,提供具体工厂实现的接口,具体创建产品交由子工厂去做,抽象工厂不涉及任何产品被实例化的细节.而不同等级的产品,就对应一个不同等级的工厂,如下图. 图1 1.1工厂方法模式(多态性工厂模式): 工厂方法模式有三个角色: 1. 抽象产品接口 2. 具体产品类 3. 抽象工厂接口 4.具体工厂类. 1.2工厂方法

设计模式之工厂模式 (二)

工厂模式分为三大类 简单工厂(SimpleFactory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 动态工厂(Dynamic Factory,属于优化版简单工厂) 一.简单工厂 组成如下: (1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑.在java中它往往由一个具体类实现. (2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口.在java中由接口或者抽象类来实现. (3) 具体产品角色:工厂类所创建的对象就是此

C++设计模式之建造者模式(三)

4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外,还可以通过Director类来更加精细地控制产品的创建过程,例如增加一类称之为钩子方法(HookMethod)的特殊方法来控制是否对某个buildPartX()的调用,也就是判断产品中某个部件是否需要被建造.钩子方法的返回类型通常为boolean类型,方法名一般为isXXX(),钩子方法定义在抽象建造者类中.在抽象建造者类中提供钩子方法的默认实现,具体建造者类如果不需要建造某个部件,则该建造者类覆盖抽象建造者类的钩子方法.

螃蟹学PHP设计模式之建造者模式

2.建造者模式 螃蟹今天要学习建造者模式了,昨天的适配器记得还是很清楚的.对于建造者模式,螃蟹的理解是你有10部iphone手机要充电,假设充电器额定电压都是220v,但是外电压不稳定,可能是220v,也可能是240v,或是300v,这个时候怎么办,可行的方法是购置一个家用变压器,把充电器都连在变压器上,不需要直接连在外电网上,无论外电压如何变化,只需要操作变压器即可.这个比喻可能有些牵强,不过还是能够说明建造者模式的用途,就是原对象可能是可变的,包括接收的参数或是方法等,但是如果我们已经在程序

大话设计模式_建造者模式(Java代码)

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 简单描述:1个产品类(可有可无,关键是建造流程),1个抽象建造步骤类,多个具体建造子类(不同的类建造不同的产品),1个指挥者(用于规定建造流程),客户端指定需要建造的具体类型,由指挥者建造好之后,建造者子类返回对应产品给客户 大话设计模式中的截图: 例子代码: Product类: 1 package com.longsheng.builder; 2 3 public class Product { 4 5 pr

设计模式3——建造者模式

1解释 1.1定义 将一个复杂对象的构建与他的表示分离,使得同样的构建可以创建不同的表示. 1.2分析 首先我们看看一般的实例化对象的方法,如下面代码: Roboter roboter = new Roboter(); roboter.setmArm("arm"); roboter.setmBody("body"); roboter.setmHead("head"); roboter.setmFoot("foot"); 对于R

【设计模式】——建造者模式

建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式结构图: Builder是为创建一个Product对象的各个部件指定的抽象接口:ConcreteBuilder是具体建造者,实现Builder接口,构建和装配各个部件:Product就是产品角色:Director是构建使用Builder接口的对象. 建造者模式主要用于创建一些复杂的对象,这些对象内部构建间的构造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化.它的好处就是使得

设计模式之建造者模式

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.(转至<大话设计模式>). 学习这个模式后,不知觉得和之前的简单工厂模式做了对比,发现二者都是创建对象.但二者还是有所区别的,简单工厂模式是更具不同的情况创建不同的对象, 而建造者模式则主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部 的构建通常面临复杂的变化. 建造者模式的好处就是使得建造代码与表示代码分离,由于建造模式印厂了该产品是如何组装的,所以需要改变一个产品的内部表