生成器模式(Builder)解析例子

面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>>   hot3.png

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

适用性:

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

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

参与者:

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

2)具体生成器ConcreteBuilder:实现Builder接口一构造和装配该产品的各个部件,定义并明确他所创建的表示。例如:PigBuilder和ChickenBuilder。这个角色完成的工作:

  (a)实现抽象建造者所声明的接口,完成创建产品实例的操作

   (b)在建造完成后,提供产品实例

 

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

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

image

 

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

Bridge模式的优点:

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

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

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

代码示例:

 

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;

}

}

pigBuilder

public class PigBuilder implements AnimalBuilder
{
    private Animal pig = null;

    public PigBuilder()
    {
        pig = new Animal();
    }

    @Override
    public void buildName()
    {
        // TODO Auto-generated method stub
        pig.setName("pig");

    }

    @Override
    public void buildLegs()
    {
        // TODO Auto-generated method stub
        pig.setLegs(4);
    }

    @Override
    public void buildMeat()
    {
        // TODO Auto-generated method stub
        pig.setMeat("pig");

    }

    @Override
    public Animal getAnimal()
    {

        buildName();

        buildLegs();

        buildMeat();

        return pig;
    }

}

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使用,从而可以装配出不同的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值