设计模式(2): 生成器模式

原创 2015年07月06日 16:31:43

  生成器模式(英:Builder Pattern)是一种设计模式,又名:建造模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
  前面一篇文章提到的抽象工厂模式与生成器相似,因为它也可以创建复杂对象。主要的区别是生成器模式着重于一步步构造一个复杂对象。而抽象工厂模式着重于多个系列的产品对象(简单的或是复杂的)。生成器在最后的一步返回产品,而对于抽象工厂来说,产品是立即返回的。

  意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
  主要解决:主要解决在软件系统中,有时候面临着”一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
  何时使用:一些基本部件不会变,而其组合经常变化的时候。
  如何解决:将变与不变分离开。
  应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的”套餐”。
  

在这样的设计模式中,有以下几个角色:
  Builder:为创建一个产品对象的各个部件指定抽象接口。
  ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
  Director:构造一个使用Builder接口的对象。
  Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

//Builder
    public interface PersonBuilder {
        void buildHead();
        void buildBody();
        void buildFoot();
        Person buildPerson();
}
//ConcreteBuilder
    public class ManBuilder implements PersonBuilder {
        Person person;
        public ManBuilder() {
            person = new Man();
        }
        public void buildbody() {
            person.setBody("建造男人的身体");
        }
        public void buildFoot() {
            person.setFoot("建造男人的脚");
        }
        public void buildHead() {
            person.setHead("建造男人的头");
        }
        public Person buildPerson() {
            return person;
        }
}
//Director
    public class PersonDirector {
        public Person constructPerson(PersonBuilder pb) {
            pb.buildHead();
            pb.buildBody();
            pb.buildFoot();
            return pb.buildPerson();
        }
}
//Product
    public class Person {
        private String head;
        private String body;
        private String foot;
        public String getHead() {
            return head;
        }
        public void setHead(String head) {
            this.head = head;
        }
        public String getBody() {
            return body;
        }
        public void setBody(String body) {
            this.body = body;
        }
        public String getFoot() {
            return foot;
        }
        public void setFoot(String foot) {
            this.foot = foot;
        }
}
public class Man extends Person {
}
//Test
    public class Test{
        public static void main(String[] args) {
            PersonDirector pd = new PersonDirector();
            Person person = pd.constructPerson(new ManBuilder());
            System.out.println(person.getBody());
            System.out.println(person.getFoot());
            System.out.println(person.getHead());
        }
}

  如果系统中只需要一个具体的建造者的话,可以省略掉抽象建造者。在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色。
  还是那句话,不要去套模式章法,怎么简洁舒服怎么用。

参考:
https://zh.wikipedia.org/wiki/%E7%94%9F%E6%88%90%E5%99%A8%E6%A8%A1%E5%BC%8F
http://baike.baidu.com/view/7995255.htm
http://www.runoob.com/design-pattern/builder-pattern.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

生成器模式将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。Builder PatternSeparate the construction of a complex objec...
  • bug_moving
  • bug_moving
  • 2016年09月25日 23:51
  • 1595

iOS设计模式(三) 生成器模式

写的比较乱,看不懂就不要看了,主要给自己看的。。 这里主要谈谈自己的理解。 生成器模式可以分割代码,让自己的类里面代码不那么庞大。 他用来构建复杂的,多个步骤构件对象的情况。 举个例子: ...
  • a2331046
  • a2331046
  • 2016年05月25日 16:25
  • 180

浅谈JavaScript设计模式——构造器模式(生成器模式)

工厂模式虽然解决了重复实例化的问题,但无法识别对象类型。 可以采用构造函数(构造方法)可用来创建特定的对象,可以解决工厂模式无法识别对象实例的问题。也就是说,使用构造函数的方法 ,即解决了重复实例化的...
  • zhouziyu2011
  • zhouziyu2011
  • 2017年04月02日 15:25
  • 290

iOS设计模式之生成器

iOS设计模式之生成器 1.生成器模式的定义 (1): 将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示 (2): 生成器模式除了客户之外还包含一个Director...
  • Judy_luo
  • Judy_luo
  • 2015年07月21日 13:55
  • 875

ANDROID 中设计模式的采用--创建型模式

模式在某一情景下解决某个问题的固定解决方案。 所有的创建型模式都是用作解决对象的创建或实例化问题的解决方案。 1  简单工厂模式 创建对象的最简单方法是使用new来创建一个对象,如果只创建一种固...
  • GooHong
  • GooHong
  • 2014年07月22日 16:39
  • 2746

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

声明:本系列博客参考资料《大话设计模式》,作者程杰。        建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为...
  • jhq0113
  • jhq0113
  • 2015年04月25日 11:30
  • 2624

IOS 设计模式 生成器模式

转载:http://www.sxt.cn/u/10618/blog/6611  选择建造自己的房子的人会把工程外包给承包商。单一承包商不能建造整个房子,他将其分解为几个部分,然后转包给几个实际的建筑...
  • lcg910978041
  • lcg910978041
  • 2016年04月23日 19:29
  • 320

设计模式(2) 生成器模式(BUILDER)

问题聚焦: 生成器模式是对象创建型模式的一种 它将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。...
  • zs634134578
  • zs634134578
  • 2014年01月04日 22:53
  • 968

设计模式大杂烩之一

模式是不断重复发生的问题、以及该问题的解决方案的核心的总和;而面向对象设计模式是在面向对象设计中对要你过来在特定场景下解决一般设计问题的类和互相通信的对象的描述。在面向对象设计中,万物皆为对象,每个对...
  • tantian189
  • tantian189
  • 2016年07月22日 17:04
  • 203

设计模式——生成器模式

一、意图将一个复杂对象的构建与它的表示分离,是的同样的构建过程可以创建不同的表示。生成器模式的一个最大特点是构建过程稳定(顺序),但是构造的具体细节不同。 二、适用性以下情况适用于适用Builder模...
  • Liuhfiii
  • Liuhfiii
  • 2015年12月13日 16:01
  • 139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式(2): 生成器模式
举报原因:
原因补充:

(最多只允许输入30个字)