[设计模式C++go]创建型模式:建造者模式

Posted 凌星An

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[设计模式C++go]创建型模式:建造者模式相关的知识,希望对你有一定的参考价值。

建造者模式

介绍

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象

定义: Separate the construction of a complex object from its
representation sothat the same construction process can create
different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)

主要解决: 主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用: 一些基本部件不会变,而其组合经常变化的时候。
如何解决: 将变与不变分离开。
关键代码:
建造者:创建和提供实例,
导演:管理建造出来的实例的依赖关系。

类图:


Product:产品类,通常是实现了模板方法模式,也就是有模板方法和基本方法
Builder:抽象建造者(抽象类或接口),规范产品的组件,一般是由子类实现
ConcreteBuilder: 具体建造者,实现抽象建造者定义的所有方法,并且返回一个组件好的对象
Director: 导演类,负责安排已有模块的顺序,然后告诉Builder开始建造

代码实现:

如果我们要组装一批iPhone手机和OPPO手机:
倘若组装过程主要分为两部:组装、外观设计
而这两种手机的步骤不太一样
iPhone:组装、外观设计(印品牌logo、外观上色)
OPPO:组装、外观设计(外观上色、印品牌logo)

C++

class PhoneBuilder
public:
	virtual void Package() = 0;
	virtual void Design() = 0;
	
	std::string GetResult()
		return _phone;
	
protected:
	 void Logo() ;
	 void Color() ;
protected:
	std::string _phone;
;

class iPhone :public PhoneBuilder
public:
	void Package()
		_phone += "packing\\n";
	
	void Design()
		Logo();
		Color();
	
	std::string GetResult()
		return _phone;
	
protected:
	void Logo()
		_phone += "Logo iPhone\\n";
	
	void Color()
		_phone += "Set Red color\\n";
	
	
;

class OPPO :public PhoneBuilder
public:
	void Package()
		_phone += "Packing\\n";
	
	void Design()
		Color();
		Logo();
	
	std::string GetResult()
		return _phone;
	
protected:
	void Logo()
		_phone += "Logo OPPO\\n";
	
	void Color()
		_phone += "Set white color\\n";
	
	
;

class PhoneDirector
public:
	void Package(PhoneBuilder* o)
		o->Package();
		o->Design();
	
	
;



测试

    PhoneDirector pd;
	PhoneBuilder* o=new OPPO;
	pd.Package(o);
	
	std::cout << o->GetResult() << std::endl;
	
	PhoneBuilder* i = new iPhone;
	pd.Package(i);
	std::cout << i->GetResult() << std::endl;

go

package Builder

type PhoneBuilder interface
   Package()
   Design()
   GetResult()string


type phone struct
     _phone string


func (p *phone)GetResult()string
     return p._phone


type IPhone struct
    phone


func (p *IPhone)Package()
   p._phone +="Packaging iPhone\\n"


func (p *IPhone)Design()
    p.logo()
    p.color()


func (p *IPhone)logo()
    p._phone +="Logo iPhone\\n"


func (p *IPhone)color()
    p._phone += "Set red color\\n"

type OPPO struct
    phone


func (p *OPPO)Package()
   p._phone +="Packaging OPPO\\n"


func (p *OPPO)Design()
    p.logo()
    p.color()


func (p *OPPO)logo()
    p._phone +="Logo OPPO\\n"


func (p *OPPO)color()
    p._phone += "Set white color\\n"



type PhoneDirectorInterface interface
      Produce(pb PhoneBuilder)


type PhoneDirectorStruct struct


func (p *PhoneDirectorStruct)Produce(pb PhoneBuilder)
       pb.Package()
       pb.Design()


测试

package main

import (
   "fmt"
  b "Builder"
)


func main()
    pd :=b.PhoneDirectorStruct
    fmt.Println("Produce iPhone")
    iphone :=&b.IPhone
    pd.Produce(iphone)
    fmt.Println(iphone.GetResult())
    fmt.Println("Produce OPPO")
    oppo :=&b.OPPO
    pd.Produce(oppo)
    fmt.Println(oppo.GetResult())




优缺点

优点:
1、建造者独立,易扩展。
2、便于控制细节风险。
由于具体的建造者是独立的,因此对建造过程逐步细化,不会对其他模块产生任何影响

缺点:
1、产品必须有共同点,范围有限制。
2、如内部变化复杂,会有很多的建造类。

使用场景

1、需要生成的对象具有复杂的内部结构。
2、需要生成的对象内部属性本身相互依赖。

与工厂模式的区别

注意事项:
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

以上是关于[设计模式C++go]创建型模式:建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

[设计模式C++go]创建型模式:建造者模式

[05]Go设计模式:建造者模式(Builder Pattern)

创建型模式 建造者模式

Go 设计模式--Builder模式

设计模式之建造者模式(创建型)

创建型模式:建造者模式