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

来源:互联网 发布:医疗软件模块 编辑:程序博客网 时间:2024/06/06 18:23
 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:建造模式使用的特点 ①:需要一个建造类,这个类负责所创建产品,零件的生成。 ②:建造类里面要提供相应的零件建造方法,遵循由多少零件就有多少个建造方法。 可以结合源代码来深入了解

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xgj1988/archive/2009/07/07/4327346.aspx