设计模式——生成器

近期的心得,我发现学一门设计模式,无论你能否立马理解它,第一最要紧的是要记住两个东西。1、它是属于什么范畴的设计模式。2、记住UML图。这两个是打开这个设计模式之门的金钥匙。为什么这么讲?由于刚刚学新的设计模式。假设一味的埋头在文字中,思想中,代码编写的样例中,假设你这个设计模式又不是看的非常懂。实在是会让人晕头转向看的吐血身亡。结果在身亡前,你都不知道这个设计模式干什么用。也不知该怎么去写。心得是,看完一篇设计模式文章。先记住它属于什么范畴的设计模式,然后就是把UML类图背记下来。再然后回头再看一遍,这样你可能就慢慢懂了些。

也能非常快的通过uml图编写出代码来。

即便此时你不是非常深刻的理解他。由于设计模式,无非就是设计出这种类的关系来,所以记住了范畴和uml类图。无论三七二十一,碰到这个需求,先依照这种关系来设计。

久而久之,你就能越来越明确这个设计模式的精髓究竟是什么了。

好。今天讲的是建造者。

    1、认识建造者

建造者模式属于创建型模式(先记下)。

顾名思义,builder的意思是建造者或者建筑工人。比如:楼房是千差万别的,楼房的外形,层数,内部房间的数量,房间的装饰都不一样。可是对于建造者来说。抽象出来的建筑流程是确定的。由于建筑一座楼房。都能够归纳为几个步骤:1打桩、2建地基、3搭框架、4内部建设。同理。建造者设计模式也是基于这种概念而生的,这个设计模式用来解决什么样的情况呢:即流程不变。但每一个流程实现的详细细节是会变化的。这种情况,能够考虑使用建造者。就像盖房子,4个流程都必须有。但每一个流程各自的实现细节,各个房子各有不同。

建造者模式的优点就是保证了流程不会变化,即流程不会添加也不会遗漏。也不会产生流程次序的错误。这是非常重要的,看新闻,一些楼歪歪的事件。非常多都是建设楼盘的时候,流程出现了问题导致的。

(看来这些人并不知道建造者模式啊)。而建造者模式。保证了流程的确定性,而流程内部的实现细节。是可继承扩展的。从根源上攻克了流程不规范的问题。

福清有一道小吃叫海蛎饼,家家户户都会做,但各家各户做的味道都不同。尽管味道不同,但制作海蛎饼的流程步骤。大致都是一样的。一个成功的海蛎饼。外酥内嫩。滋味丰富。尽管口感各有不同,但仅仅要流程步骤不差,都会做出好吃的海蛎饼。

而一些刚嫁人的新媳妇们制作海蛎饼却不如婆婆好,由于新媳妇刚学做,不熟悉流程,难免流程常有疏漏。而假设让婆婆站在媳妇旁把控制作流程,海蛎饼就不会差。所以说。假设流程控制好了。生产出来的海蛎饼就不会差。

写代码也是如此,假设你遇到一个须要把控流程。但流程中的实现细节各有很多的方式,你能够採用建造者模式。用一个director类把控流程,而用很多不同的builder去建造流程中的细节并产生产品。这样,生产出来的产品是绝对不会出问题的。由于流程把控好了。

你能够有多个builder去负责建造生产产品,而让director去把控流程。假设有新的产品,可是流程一致,你能够再扩张出一个builder来。这样,你看,建造者模式是不是非常符合OCP原则呢。

说了这么多,来看下建造者模式的概念:将一个复杂的对象的构建与它的表示分离。使得相同的构建过程能够有不同的表示。

嗨。这个概念看起来总是这么深奥难懂。大概的意思。就是一套的构建过程能够有不同的产品(表示)出来。这些产品(表示)都依照这一套的构建过程被生产出来。

建造者模式通常包含下面这几个角色:

1、Builder:给出一个抽象接口,规范建造者对于生产的产品的各个组成部分的建造。这个接口仅仅是定一个规范,不涉及详细的建造,详细的建造让继承于它的子类(ConcreteBuilder)去实现。

2、ConcreteBuilder:实现builder接口,针对不同的商业逻辑,详细化各对象部分的建造,最后返回一个建造好的产品。

3、Director:导演。顾名思义,负责规范流程之用。在指导中不涉及产品的创建,仅仅负责保证复杂对象各部分被创建或按某种顺序创建。

4、Product:复杂对象。

依照惯例。给出建造者模式的UML图(这个先记下来,很实用。学一个设计模式,先把这个图记下来!)

2、一个建造者的实例。

在此。以这篇文章作为參考http://blog.csdn.net/lovelion/article/details/7426015,我们来做一个游戏的案例。

游戏开发中,游戏角色是一个复杂的产品,它包含性别、脸型、身材等多个组成部分,不同的角色组成部分有所差异。如这张图:

不管是何种类型的游戏的游戏角色,它的创建步骤都大同小异,都须要逐步创建其组成部分,再将各组成部分装配成一个完整的游戏角色。

一个典型的复杂类对象代码示比例如以下:

class Productor {

private Part partA;

private Part partB;

private Part partC;

// 这些是各个部件的set和get的方法。在此省略。

。。

}

这是抽象的Builder:

abstract class Builder {

public abstract void buildPartA();

public abstract void buildPartB();

public abstract void buildPartC();

}

继承Builder的详细的建造者:

class ConcreteBuilder extends Builder {

private Product product;

// 创建partA

public void buildPartA() {

// 在此创建出部件

Part partA = new PartA();

// ......

// 把partA传递给product

product.setPartA(partA);

}

// 创建partB

public void buildPartB() {

// 在此创建出部件

Part partB = new PartB();

// ......

// 把partB传递给product

product.setPartA(partB);

}

// 创建partC

public void buildPartC() {

// 在此创建出部件

Part partC = new PartC();

// ......

// 把partC传递给product

product.setPartA(partC);

}

// 返回复杂产品对象

public void getProduct() {

return this.product;

}

}

这是导演,负责流程规范。在导演类中能够注入建造者对象。

class Director {

private Builder concretebuilder;

// 构造方法中也能够传递builder

public Director(Builder builder) {

this.concretebuilder
= builder;

}

// 传递builder

public void setBuilder(Builder builder) {

this.concretebuilder
= builder;

}

// 这种方法用来规范流程,产品构建和组装方法

public void construct() {

builder.buildPartA();

builder.buildPartB();

builder.buildPartC();

}

}

// client使用:

class Main {

public static void main(String[] args) {

// 对于client而言,仅仅须要关心详细的建造者,无需关心产品内部构建流程。我假设须要其它的复杂产品对象。仅仅须要选择其它的建造者,假设须要扩展,则仅仅须要写一个新的builder即可。假设能够,这个建造者甚至能够用配置文件做。添加很多其它的扩展性。

Builder builder = new ConcreteBuilder();

// 把建造者注入导演

Director director = new Director(builder);

// 指挥者负责流程把控

director.construct();

// 建造者返回一个组合好的复杂产品对象

Productor productor = builder.getProductor();

}

}

不知道大家在此有否发现,上面的样例。通过使用建造者模式,建造过程通过Director的construct的方法固定下来了。

建造过程不会变。但详细的部位,头,身体。脚的表现方式。让详细的builder去实现了。这样不仅使得小人的建造过程不变。并且有利于功能的扩展。

3、使用建造者模式的优点

1.使用建造者模式能够使client不必知道产品内部组成的细节。

2.详细的建造者类之间是相互独立的,对系统的扩展很有利。

3.因为详细的建造者是独立的,因此能够对建造过程逐步细化。而不正确其它的模块产生不论什么影响。

4、使用建造者模式的场合:

1.创建一些复杂的对象时,这些对象的内部组成构件间的建造顺序是稳定的,可是对象的内部组成构件面临着复杂的变化。

2.要算法创建复杂的对象。独立对象的一部分,也独立的组件部分的组合物的。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-19 01:54:50

设计模式——生成器的相关文章

设计模式-生成器模式

前言 点击查看:设计模式系列 生成器模式(建造者模式/builder) 定义:将一个复杂的对象,分成多分,使同样的构建过程,能有不同的表示,这样的设计模式被称为建造者模式. 举例说明: 李嘉诚的遗嘱执行: 财产(产品角色):李嘉诚拥有众多复杂的财产框架,这里以现金与物品入例. 遗嘱(建造者):相当于建造者,分配现金与物品. 具体遗嘱(具体建造者):1.给大儿子的财产分配,2,给小儿子的财产分配. 律师(指导者角色):按照具体的遗嘱指令分配财产. 例子类图: 庞大的财产结构代码: // 财产(复杂

Java设计模式--生成器模式

将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示. Builder Pattern Separate the construction of a complex object from its representation so that the same construction process can create different representations. 类图 模式的结构与使用 生成器模式的结构中包括四个角色. 产品(Product):具体生成器要构造的复

iOS设计模式——生成器模式

选择建造自己的房子的人会把工程外包给承包商.单一承包商不能建造整个房子,他将其分解为几个部分,然后转包给几个实际的建筑商,他们懂得如何将零部件组装起来.房子由由风格.颜色和尺寸各不相同的部件组成.客户告诉承包商房子里都要有什么,然后承包商协调各房屋建筑商,决定需要做什么.应该如何建造,建筑商就如何施工.建房子是个复杂过程,单凭一双手就想建房子,即便可能也非常困难.如果承包商(指导者)与懂得如何建造的建筑商相互协调,这一过程简单得多且更易管理. 有时,构建某些对象有多种不同方式.如果这些逻辑包含在

跟着实例学习设计模式-生成器模式(builder)

生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得相同的构建过程能够得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者,为创建一个Vehicle对象并创建它的相关部件指定的抽象接口,把产品的生产过程分解为不同的步骤,从而使具体的建造者在具体的建造步骤上具有更多弹性,从而创造出不同表示的产品.(这里就是小车和卡车) CarBuilder.TrunkBuilder:具体建造者,实现IVehicleBuilder接口,构造和装配产品的各个部件定义并明确

Objective-C设计模式——生成器Builder(对象创建)

生成器 生成器,也成为建造者模式,同样是创建对象时的设计模式.该模式下有一个Director(指挥者),客户端知道该类引用用来创建产品.还有一个Builder(建造者),建造者知道具体创建对象的细节. 指挥者只是起到协调的作用,它有一个Builder引用用于指挥Builder如何创建对象,Builder内就是为了构建对象的算法. 其实生成器模式,就是为了定制某些特定对象而产生的模式.对象的过长往往非常的复杂,如果不是用该模式来创建对象,对象创建类将会非常的冗余且难以复用.使用生成器将表现层和创建

iOS设计模式 - 生成器

原理图 说明 1. 将构建复杂对象的过程拆分成一个一个的模块,通过统一的指导者来指导对象的构建过程称之为生成器模式 2. 生成器模式适合用于构建组合的对象 源码 https://github.com/YouXianMing/BuilderPattern // // CarBuilder.h // BuilderPattern // // Created by YouXianMing on 15/9/14. // Copyright (c) 2015年 YouXianMing. All right

设计模式——生成器模式

这次来看下生成器模式,先来看下类图: 那么来说下特点吧: 将一个复杂对象的创建过程封装起来 允许对象通过多个步骤来创建,并且可以改变过程 实现可以被替换 隐藏了内部实现 来看下代码吧: public abstract class AbstractCarBuilder { public Car car = new Car(); public abstract AbstractCarBuilder builderName(String name); public abstract AbstractC

生成器模式(Builder)

1. 模式的定义 不管是输出成文本文件,还是输出到XML文件,在实现的时候,步骤基本都是一样的,大致可以分为以下四步: 1)先拼接文件头的内容 2)然后拼接文件体的内容 3)再拼接文件尾的内容 4)最后拼接好的内容输出称为文件 换句话说,也就是构建每种格式的数据文件的处理过程,应该和具体的步骤实现分开,这样能够复用处理过程. 生成器模式的定义:将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示. 2. UML图 Builder:生成器接口,定义创建一个Product对象

设计模式(博客园精化集)

Web Client Software Factory系列(3):View-Presenter模式作者: TerryLee .NET设计模式(18):迭代器模式(Iterator Pattern)作者: TerryLee .NET设计模式(19):观察者模式(Observer Pattern)作者: TerryLee .NET设计模式(2):单件模式(Singleton Pattern)作者: TerryLee .NET设计模式(3):抽象工厂模式(Abstract Factory)作者: Te