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