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

  生成器模式(英: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

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

时间: 2024-11-08 15:14:04

设计模式(2): 生成器模式的相关文章

每天一个设计模式-7 生成器模式(Builder)

每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式. 导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾. 二.问题分析 无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同.即他们的构造算法固定,只是生成的结果不同:能不能把算法(构建)和结果(外观)分离出

设计模式开始--生成器模式

生成器模式 设计模式的原则:尽量暴漏在主程序里面的代码扩展性强一些,多用接口和虚拟类,少用实现类,这样再改程序的时候就方便的多了. 1.作用:一个Product类的产生需要多个其他的类Unit顺序生成之后组合而成,而且这些Unit的产生方法是不固定的. 举例而言一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用.比如,一个电子邮件有发件人地址.收件人地址.主题.内容.附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出.有些情况下,一个对象的一些性

Java设计模式:生成器模式

问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); 之所以容易创建,因为其类成员都是基本数据类型或者封装类,或者字符串.但是如果对象的类成员还是对象,那么创建这个对象还需要产生该对象成员的具体对象. public class Unit1 { } public class QuestionProduct {     Unit1 u1;     Unit2 u2;

设计模式之生成器模式

GOF对生成器模式的描述为:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.感觉这是创建型模式中最难理解的一个,参考了<Java与模式>一书,在这本书中,作者侧重描述一个产品不同内部表象(也就是零件)的创建,他在"众神造人"一例中,将"人"划分为"灵魂"."臂手"."耳目"等部件,当这些部件均被创建好后,一个"人"才算是被创建好,总觉的他的示例与GO

深入浅出设计模式 ------ Builder(生成器模式)

一. 定义  将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 二. 结构  三. 参与者 Builder : 为创建一个Product对象的各个部件指定抽象接口. ConcreteBuilder : 实现Builder的接口以构造和装配该产品的各个部件.定义并明确它所创建的表示.提供一个检索产品的接口. Director : 构造一个使用(聚合:has-a的关系)Builder接口的对象.如下文代码ChefDirector类. Product : 表示被构造的复杂对

设计模式-生成器模式

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

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

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

设计模式学习笔记(十二:生成器模式)

1.1概述 将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示.这就是生产器模式的定义. 如果一个类中有若干个成员变量是其他类声明的对象,那么该类创建的对象就可以包含若干个其他对象作为其成员.习惯上把一个对象中的成员对象称作它的组件,例如,几何(Geometry)类含有三角形(Triangle)类.矩形(Rectangle)类和圆(Circle)类声明的对象,那么几何类就可以创建一个由三角形.矩形和圆形组成的几何图形,三角形.长方形和圆形就是当前几何图形中的组件. 但是,在编

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

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