跟屌丝大哥学习设计模式---生成器模式(Builder)解析例子

生成器模式属于对象结构型模式,其意图是将一个复杂对象的构建与他的表示分离,使得同样的构建创建过程可以创建不同的表示。

适用性:

1.         当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时

2.         当构造过程必须允许被构造的对象有不同的表示时。

 

参与者:

       生成器Builder:为创建一个Product对象的各个部件指定抽象接口(AnimalBuilder)。

       具体生成器ConcreteBuilder:实现Builder接口一构造和装配该产品的各个部件。

                     定义并明确他所创建的表示,

                     提供一个检索产品的接口(getAnimal)。

导向器:构建一个适用Builder对象的接口。

Product(Checken,pig):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终的产品。

图1

当客户需要一个产品时,把需要的参数传递个导向器,导向器根据传递的参数调用具体的生成器,具体的生成器通过一系列的操作(getAnimal()通过调用其它的接口方法实现)最会返回一个产品。

Bridge模式的优点:

1.         它使你可以改变一个产品的内部表示,Builder对象提供给导向器一个构造产品的抽象接口,该接口使得生成器可以隐藏这个产品的表示和内部结构,他同时也隐藏了该产品是如何装配的,因为产品时通过抽象接口构造的(注:本例子把接口的实现放在具体类中了),你在改变该产品的内部表示时所要做的只是定义一个新的生成器。

2.         他将构造代码和表示代码分开,这有点类似于模板模式。所不同的是模版模式最终是完成复杂的工作,而生成器的目的是要生成一个复杂的对象。

3.         他使得你对构造过程进行更加精细的控制。Builder模式是在导向者的控制下一步一步构造产品的,仅当该产品完成时,导向者才从生成器中取回产品。因此Builder模式能更好的反映产品的构造过程,使你可以更精细的控制构建过程,从而能更精细的控制所的产品的内部结构。

代码示例:

AnimalBuilder:代码

package builder;

public interface AnimalBuilder{

    public void buildName();

    public void buildLegs();

    public void buildMeat();

    public Animal getAnimal();

}

ChickenBuilder的代码:

package builder;

public class ChickenBuilder implements AnimalBuilder{

    private Animal chicken = null;

    public ChickenBuilder(){

       chicken = new Animal();

    }

    public void buildName(){

       chicken.setName("chicken");

    }

    public void buildLegs(){

       chicken.setLegs(2);

    }

    public void buildMeat(){

       chicken.setMeat("chicken");

    }

    public Animal getAnimal(){

       buildName();

       buildLegs();

       buildMeat();

       return chicken;

    }

}

Animal代码:

package builder;

public class Animal{

    private String name;

    private String meat;

    private int legs;

    public String getName(){

       return name;

    }

    public String getMeat(){

       return meat;

    }

    public int getLegs(){

       return legs;

    }

    public void setName(String aName){

       name = aName;

    }

    public void setMeat(String aMeat){

       meat = aMeat;

    }

    public void setLegs(int alegs){

       legs = alegs;

    }

}

Director代码:

package builder;

public class Director{

    public Animal getAnimal(String aName){

       if(aName.equals("chicken")){

           return new ChickenBuilder().getAnimal();

       }

       else if(aName.equals("pig")){

           return new PigBuilder().getAnimal();

       }

       else return null;

    }

}

 

客户端代码:

package builder;

public class Client{

    public static void description(Animal animal){

       String desc = "This animal is called "+animal.getName();

       desc +="\n Its meat is "+animal.getMeat();

       desc +="\n And it has "+animal.getLegs()+" legs.";

       System.out.println(desc);

    }

    public static void main(String[] args){

       String aName = "chicken";

       Director d = new Director();

       Animal animal =d.getAnimal(aName);

       description(animal);

       aName = "pig";

       animal = d.getAnimal(aName);

       description(animal);

    }

}

结论:生成器模式使得客户可以更加精细的控制一个对象的构建,每个具体的创建者包含了创建和装配一个特定产品的所有代码,这些代码只用写一次,便可以被不同的Director使用,从而可以装配出不同的对象。

 

====================================分割线================================

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-02 23:20:07

跟屌丝大哥学习设计模式---生成器模式(Builder)解析例子的相关文章

跟屌丝大哥学习设计模式--生成器模式(Builder)

Builder 模式的重心在于分离构建算法和具体的构造实现,从而使构建算法可以重用. Builder 模式的构成分为两部分:一部分是Builder接口,定义了如何构建各个部件,并装配到产品中去:另一部分是Director,定义如何来构建产品,Director 负责整体的构建算法,而且通常是分步来执行的. 注:这里的构建算法是指:通过什么样的方式来组装产品:构建产品指的是:构建一个复杂对象. Builder 模式就是将构建产品部件和组装产品的过程分开,即实现了产品部件和组装产品过程的解耦,可以使得

跟屌丝大哥学习设计模式---代理模式

Java 代理模式详解 代理模式是我们比较常用的设计模式之一.其中新思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象.这些额外的操作通常需要与实际对象进行通信,代理模式一般涉及到的角色有:  抽象角色:声明真实对象和代理对象的共同接口:  代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装.  真实角

跟屌丝大哥学习设计模式---代理模式之动态代理

动态代理 java中动态代理机制的引入使得代理模式的思想更加完善与进步,它允许动态的创建代理并支持对动态的对所代理的方法进行调用.Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:  (1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args).在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上

跟屌丝大哥学习设计模式--享元模式

四.举例 这里就以去餐馆吃饭为例详细的说明下享元模式的使用方式.去菜馆点菜吃饭的过程大家一定都是轻车熟路了,这里就不赘述.在例子中我使用了一个list来存放外蕴状态和内蕴状态的对应关系,而且提供了查询每个客人点菜情况的方法.内蕴状态在这里代表了菜肴的种类,而外蕴状态就是每盘菜肴的点菜人.  A 让我们先来看看单纯享元模式的实现吧.     先看下抽象享元角色的定义:GoF对享元模式的描述是:运用共享技术有效地支持大量细粒度的对象. Flyweight模式是构造型模式之一,它通过与其他类似对象共享

跟屌丝大哥学习设计模式-抽象工厂模式

1.3 抽象工厂(Abstract Factory)模式    抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品具体类型的情况下,创建多个产品族中的产品对象.这就是抽象工厂模式的用意.     每个模式都是针对一定问题的解决方案.抽象工厂模式面对的问题是多产品等级结构的系统设计.     在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级.     产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族.比如AMD的CPU和ADM芯片的主板,组成一个家族.

跟屌丝大哥学习设计模式--工厂方法模式

东汉<风俗通>记录了一则神话故事:"开天辟辟,未有人民,女娲搏,黄土作人--",讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有生物,只有苍茫大地,纯粹而洁净的自然环境,寂静而又寂寞,于是女娲决定创造一个新物种(即人类)来增加世界的繁荣,怎么制造呢?       别忘了女娲是神仙,没有办不到的事情,造人的过程是这样的:首先,女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生:       第一

跟屌丝大哥学设计模式-单例模式

概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.哈哈 我们可以这样分 屌丝单例模式:懒汉式屌丝单例,饿汉式屌丝单例,登记式屌丝单例. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都

跟屌丝大哥学习DB2---DB2 runstats、reorgchk、reorg 命令

1.runstats runsats可以搜集表的信息,也可以搜集索引信息.作为runstats本身没有优化的功能,但是它更新了统计信息以后,可以让DB2优化器使用最新的统计信息来进行优化,这样优化的效果更好.   runstats   on   table   <tbschema>.<tbname>   收集表   <tbname>   的统计信息.表名必须是用   <dbschema>   全限定的.       2.reorg    A. reorg  

设计模式学习——建造者模式(生成器模式)

所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern 简介: 建造者模式也叫做生成器模式,定义为:封装一个产品的构造过程,并且按此步骤构造. 建造者模式(生成器模式)属于创建类模式,和工厂模式相比,你会觉得有点类似,但是有区别之处.不过,建议在看下去之前,得明白三个工厂模式,如果你记得不太清楚了,可以看这里,简单工厂,工厂方法,抽象工厂. UML类图: 看一下uml类图.这一部分,如果不清楚,可以先看下面的场景部分,再回过头来