设计模式---建造者模式(Builder Pattern)

        现实中有这样一种情况:有些对象的内部结构比较复杂,一般是由各种对象数据组合而来的.而且在某些

  情况下,对象的属性必须按照一定的顺序赋值才有意义。这样无论是使用工厂模式、工厂方法模式亦或是抽

  象工厂模式都不符合该情景。

       解决上述问题,应该使用建造者模式。

       建造者(Builder)模式:

               建造者模式也叫生成器模式,他可以将一个产品对象的内部表象与产品的产生过程分离开来,从而

           使一个建造过程生成具有不同内部表象的产品对象。简单的说建造产品的过程,就是“组合零件”的过

            程,这些零件就相当于产品对象的内部表象,但是因为组合零件的过程十分复杂。因此,这个过程

            往往被“外部化”到一个Builder对象去,Builder返回给用户一个全部零件构建完毕的产品对象。

         说了这么多,接下来看看Builder模式的结构吧,了解其工作原理。

       建造者(Builder)模式结构图:

    

           

          建造者(Builder)模式角色:

                       建造者角色(Builder):是一个接口,用以规范产品对象的各个组成成分的建造,独立于应用程

                                            序的商业逻辑。具体建造者必须实现接口。

                       具体建造者(Concrete Builder): 需要实现建造者角色接口,用于创建产品实例,并提供创建

                                            的产品实例。

                        指导者角色(Director):调用ConcreteBuilder类创建对象,其本身并没有产品对象类的具体内容。

                       产品角色(Product):是该模式中要创建的复杂对象。

                Director是用于和客户端打交道的角色,他将客户端创建产品的请求划分为对各个零件的创建请求,

                再将这些请求交给Concrete Builder,Concrete Builder的创建过程对于客户端来说是隐藏的。

           下面在以一个简单的例子程序说明、学习建造者模式!(关于台式机组装的问题)

            一个台式机就相当于一个复杂对象,他拥有CPU,MONITOR,KEYBOARD等等组件,其创建过程

            可以用创建者模式模拟。

                 首先构建一些Computer对象所需要的组件:

package com.kiritor;
/**CPU*/
public class CPU {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public CPU() {
		// TODO Auto-generated constructor stub
	}
	public CPU(String name)
	{
		this.name=name;
	}
	
}

/**Keyboard*/
package com.kiritor;

public class Keyboard {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Keyboard() {
		// TODO Auto-generated constructor stub
	}
	public Keyboard(String name)
	{
		this.name=name;
	}
}

/**Monitor*/
package com.kiritor;

public class Monitor {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Monitor() {
		// TODO Auto-generated constructor stub
	}
	public Monitor(String name)
	{
		this.name=name;
	}
}
                    Computer类:

package com.kiritor;

/**
 * @author Kiritor 产品类
 */
public class Computer {
	private CPU cpu;
	private Keyboard keyboard;
	private Monitor monitor;

	public CPU getCpu() {
		return cpu;
	}

	public void setCpu(CPU cpu) {
		this.cpu = cpu;
	}

	public Keyboard getKeyboard() {
		return keyboard;
	}

	public void setKeyboard(Keyboard keyboard) {
		this.keyboard = keyboard;
	}

	public Monitor getMonitor() {
		return monitor;
	}

	public void setMonitor(Monitor monitor) {
		this.monitor = monitor;
	}

}
            抽象建造者类:

package com.kiritor;
/**
 * @author Kiritor
 * 抽象生成器*/
public abstract class Builder {
   abstract public  void buildCPU();
   abstract public  void buildMonitor();
   abstract public  void buildKeyboard();
   public Computer getComputer()
   {
	   return null;
   }
   
}
               具体建造者类:

package com.kiritor;
/**
 * @author Kiritor
 * 具体生成类*/
public class ConcreteBuilder extends Builder{
	private Computer computer =new Computer();
	@Override
	public void buildCPU() {
		// TODO Auto-generated method stub
		computer.setCpu(new CPU("i5"));
		
	}
	@Override
	public void buildKeyboard() {
		// TODO Auto-generated method stub
		computer.setKeyboard(new Keyboard("巧克力键盘"));
		
	}
	public void buildMonitor() {
		computer.setMonitor(new Monitor("三星"));
	}
	public Computer ConcreteBuilder() {
		// TODO Auto-generated constructor stub
		return computer;
	}

}
              指导类:
package com.kiritor;
/**
 * @author Kiritor
 * 向导类*/
public class Director {
	/*指导复杂对象的创建过程,参数为建造类*/
   public void buildComputer(Builder builder)
   {
	   /*这里可以决定个对象的建造次序*/
	   builder.buildCPU();
	   builder.buildKeyboard();
	   builder.buildMonitor();
   }
}
              测试类:

package com.kiritor;

public class Client {
 public static void main(String[] args) {
	//首先实例化一个指导类
	 Director director = new Director();
	 //其次实例化一个具体建造类
	 Builder builder = new ConcreteBuilder();
	 director.buildComputer(builder);//客户端对复杂产品创建过程是不可见的
	 Computer computer = builder.getComputer();
	
}
}
            由以上代码可以看出,建造者模式中,客户端只是负责创建指导者和建造者对象,由 指导者

    控制建造者创建产品,最后建造者把产品返回给客户端。因此产品的创建细节对于客户端来说

    是隐藏的。

          既然知道了建造者模式的工作方式,那么他的具体使用场景是什么呢?

             1、需要生成的产品对象有复杂的结构

             2、生成的产品的属性可以相互依赖,建造者模式可以强迫他们的顺序

         建造者模式是产品的内部表象可以独立变化,建造者模式可以对客户端隐藏产品的组成细节








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值