建造模式-电脑篇(转载)

 
package org.xgj.build;  public class Client {  public static void main(String[] args) {  Builder builder = new PCBuilder();  /*  * builder.buildCpu(); 这里其实是不允许的,但是这里不会报出,因为为了测试,  * 我的client和我的创建模式的类放在同一个包下面的,真正的开发,是不会这样的  */  PC pc = builder.construct();  System.out.println(pc);  System.out.println("------------电脑用了1年--------");  System.out.println("------------cput坏了,换新的------------");  CPU newCpu=new IntelCPU("型号2");  pc.setCpu(newCpu);  System.out.println(pc);  System.out.println("------------电脑用了2年--------");  System.out.println("------------显卡坏了,拿去修理------------");   //得到显卡 对显卡进行一系列操作,这里省略  VideoCard videoCard=pc.getVideoCard();  } }     package org.xgj.build;  public abstract class Builder {  // 注意:这里用抽象类而没有用接口,是因为建造零件的方法必须是protected的,其实可以想一下  //我们去配电脑的时候,是不会知道厂商是如何去创建CPU和显卡的,但是你的系统针对的是组装机,那么这里你可以暴露给用户,再强调一次,设计模式  //其实就是使大家设计出来的系统对"开-闭原则"的支持,如果一味的遵循书上的,那么就真的是死读书的例子了   // 创建CPU  protected abstract void buildCpu();   // 创建显卡  protected abstract void buildVideoCard();   // 其他零件省略....  public abstract PC construct(); }     package org.xgj.build;  public class PCBuilder extends Builder {  private PC pc = new PC();   protected void buildCpu() {  // 根据系统需求不同,在这之前可以做一些逻辑操作,这里省略  CPU intelCpu = new IntelCPU("型号1");  pc.setCpu(intelCpu);  }   protected void buildVideoCard() {  // 根据系统需求不同,在这之前可以做一些逻辑操作,这里省略  VideoCard videoCard = new ATI_VC("型号2");  pc.setVideoCard(videoCard);  }  public PC construct() {  buildCpu();  buildVideoCard();  return pc;  } }    package org.xgj.build;  public class PC {  //这里为提供公开的set和get,其实很简单,大家想一下,我们的CPU坏了,是不是要求换一个啊?那么肯定要先得到原来的啊?可能修一下(改变对象属性),  //可能换一个(从新new一个,然后给setCpu)  CPU cpu;  VideoCard videoCard;   public VideoCard getVideoCard() {  return videoCard;  }   public void setVideoCard(VideoCard videoCard) {  this.videoCard = videoCard;  }   public CPU getCpu() {  return cpu;  }   public void setCpu(CPU cpu) {  this.cpu = cpu;  }   @Override  public String toString() {  return cpu.toString() + videoCard.toString();  } }     package org.xgj.build;  public interface CPU { }      package org.xgj.build;  public class IntelCPU implements CPU {  String name;  IntelCPU(String name) {  this.name=name;  }  public String toString() {  return "IntelCPU,型号:"+name;  } }       package org.xgj.build;  public interface VideoCard {  }     package org.xgj.build;  public class ATI_VC implements VideoCard{  String name;  public ATI_VC(String name) {  this.name=name;  }  @Override  public String toString() {  return "ATI卡,型号:"+name;  } } package org.xgj.build;
public class Client {public static void main(String[] args) {Builder builder = new PCBuilder();/* * builder.buildCpu(); 这里其实是不允许的,但是这里不会报出,因为为了测试, * 我的client和我的创建模式的类放在同一个包下面的,真正的开发,是不会这样的 */PC pc = builder.construct();System.out.println(pc);System.out.println("------------电脑用了1年--------");System.out.println("------------cput坏了,换新的------------");CPU newCpu=new IntelCPU("型号2");pc.setCpu(newCpu);System.out.println(pc);System.out.println("------------电脑用了2年--------");System.out.println("------------显卡坏了,拿去修理------------");//得到显卡 对显卡进行一系列操作,这里省略VideoCard videoCard=pc.getVideoCard(); }}

package org.xgj.build;
public abstract class Builder {// 注意:这里用抽象类而没有用接口,是因为建造零件的方法必须是protected的,其实可以想一下//我们去配电脑的时候,是不会知道厂商是如何去创建CPU和显卡的,但是你的系统针对的是组装机,那么这里你可以暴露给用户,再强调一次,设计模式//其实就是使大家设计出来的系统对"开-闭原则"的支持,如果一味的遵循书上的,那么就真的是死读书的例子了// 创建CPUprotected abstract void buildCpu();
// 创建显卡protected abstract void buildVideoCard();
// 其他零件省略....public abstract PC construct();}

package org.xgj.build;
public class PCBuilder extends Builder {private PC pc = new PC();
protected void buildCpu() {// 根据系统需求不同,在这之前可以做一些逻辑操作,这里省略CPU intelCpu = new IntelCPU("型号1");pc.setCpu(intelCpu);}
protected void buildVideoCard() {// 根据系统需求不同,在这之前可以做一些逻辑操作,这里省略VideoCard videoCard = new ATI_VC("型号2");pc.setVideoCard(videoCard);}public PC construct() {buildCpu();buildVideoCard();return pc;}}

package org.xgj.build;
public class PC {//这里为提供公开的set和get,其实很简单,大家想一下,我们的CPU坏了,是不是要求换一个啊?那么肯定要先得到原来的啊?可能修一下(改变对象属性),//可能换一个(从新new一个,然后给setCpu)CPU cpu;VideoCard videoCard;
public VideoCard getVideoCard() {return videoCard;}
public void setVideoCard(VideoCard videoCard) {this.videoCard = videoCard;}
public CPU getCpu() {return cpu;}
public void setCpu(CPU cpu) {this.cpu = cpu;}
@Overridepublic String toString() {return cpu.toString() + videoCard.toString();}}

package org.xgj.build;
public interface CPU {}


package org.xgj.build;
public class IntelCPU implements CPU {String name;IntelCPU(String name) {this.name=name;}public String toString() {return "IntelCPU,型号:"+name;}}


package org.xgj.build;
public interface VideoCard {
}

package org.xgj.build;
public class ATI_VC implements VideoCard{String name;public ATI_VC(String name) { this.name=name;}@Overridepublic String toString() {return "ATI卡,型号:"+name;}}


1:建造模式的优点:封装一些用户不需要知道的逻辑,给用户清晰的使用接口,也是对自身框架的安全起到一定作用。
2:缺点,见3.
3:对“开-闭原则”的支持:1添加新的生成对象那么要添加一个新的建造对象,比如添加一个TV,那么就有一个TVBuilder.其实也可以和工厂方法混用,那么就不是一个建造类创建一个生成对象了。对于新加零件的话,那么就会涉及到源代码的修改。
4:java中建造模式的运用:JavaMail.
5:建造模式的实用范围:对象的产生不是单一的,而是伴随着一些零件的产生而组装起来的,而且零件之前的建造顺序也有严格限定。满足以上任何一点都可以使用建造模式。
6:建造模式使用的特点 ①:需要一个建造类,这个类负责所创建产品,零件的生成。 ②:建造类里面要提供相应的零件建造方法,遵循由多少零件就有多少个建造方法。 可以结合源代码来深入了解

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/xgj1988/archive/2009/07/07/4327346.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值