java设计模式之建造者模式学习
1 概述 2 示例 苹果:
复制代码 代码如下: package org.scott.builder.before.use; import java.util.ArrayList; /** public void createScreen() { 三星:
复制代码 代码如下: package org.scott.builder.before.use; import java.util.ArrayList; /** public void createScreen() { 测试客户端: 复制代码 代码如下: package org.scott.builder.before.use; /** * @author Scott * @version 2013-11-20 * @description */ public class BuilerTest { private static ApplePhone iphone = new ApplePhone(); private static SamsungPhone samPhone = new SamsungPhone(); public static void main(String args[]){ iphone.createCPU(); iphone.createScreen(); iphone.createBattery(); iphone.show(); samPhone.createCPU(); samPhone.createScreen(); samPhone.createBattery(); samPhone.show(); } } 是不是发现个问题?那就是生产手机的每一道工序都是一样的,确切的说是工序名称一样,只是具体的每个工序的处理不同,工序是不变的,就这么几步,每道工序的具体处理是变化的,由此,我们可以把不变的抽取出来,以“不变应万变”,将变化的,交给具体的产品来做。 首先来个Phone的接口: 复制代码 代码如下: package org.scott.builder.after.use; import java.util.ArrayList; /** public void show(){ 苹果手机类: 复制代码 代码如下: package org.scott.builder.after.use; /** * @author Scott * @version 2013-11-20 * @description */ public class ApplePhone extends Phone{ } 三星手机类: 复制代码 代码如下: package org.scott.builder.after.use; /** * @author Scott * @version 2013-11-20 * @description */ public class SamsungPhone extends Phone{ } 再定义个生产步骤的接口Builder: 复制代码 代码如下: package org.scott.builder.after.use; /** * @author Scott * @version 2013-11-20 * @description */ public interface Builder { public void buildCPU(); public void buildScreen(); public void buildBattery(); public Phone getPhone(); } 苹果手机的Builder: 复制代码 代码如下: package org.scott.builder.after.use; /** * @author Scott * @version 2013-11-20 * @description */ public class ApplePhoneBuilder implements Builder{ private Phone phone = new ApplePhone(); @Override public void buildCPU() { phone.add("CUP: Qualcomm"); } @Override @Override @Override } 三星手机的Builder: 复制代码 代码如下: package org.scott.builder.after.use; /** * @author Scott * @version 2013-11-20 * @description */ public class SamsungPhoneBuilder implements Builder{ private Phone phone = new SamsungPhone(); @Override public void buildCPU() { phone.add("CUP: MTK"); } @Override @Override @Override } 指导具体生产手机的Director: 复制代码 代码如下: package org.scott.builder.after.use; /** * @author Scott * @version 2013-11-20 * @description */ public class Director { private Builder builder; public Director(Builder builder){ this.builder = builder; } public void construct(){ builder.buildCPU(); builder.buildScreen(); builder.buildBattery(); } } 最后写个测试类: 复制代码 代码如下: package org.scott.builder.after.use; /** * @author Scott * @version 2013-11-20 * @description */ public class BuilderTest { private static Builder iPhoneBuilder = new ApplePhoneBuilder(); } 运行结果: 复制代码 代码如下: iphone 产品部件信息:CUP: Qualcomm SCREEN: JDI BATTERY: DeSai samSung 产品部件信息:CUP: MTK SCREEN: Samsung BATTERY: DeSai 这里的两个Phone实体类是空的,如果是这种情况,那么它们可以省略掉,如果 Phone接口也可以被省略掉,最终剩下的就只有 Director、Builder、和具体的 Bulider 实现类。并且,ApplePhone类和 SamsungPhone类是有关系的两个类,它们不同的手机品牌,如果遇到两个或多个没有太多关系的类,公共的接口Phone就没有存在的必要,但是这时候,那么 Builder 接口的规定的 getPhone() 方法的返回值怎么确定呢? 无论返回值类型是 ApplePhone还是SamsungPhone,都会产生问题,因为返回结果的类型不统一。此时,可以将 Phone定义成一个空接口(不包含任何方法的接口),再让这些没有相互关系的具体产品类都去实现这个接口,那么 Builder 接口里面规定的 getPhone() 方法的返回值类型依然是 Phone 类型,就解决问题了。不过这种情况下,也就没有使用Builder模式的必要了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java编程之xpath介绍
- 新手上路之JDK8的下载、安装与PATH环境变量的配置
- Java 8流,将对象List转换为Map>
- PlayFramework 2.2 Java Action Composition
- Java 条件语句 if else
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02
- java – 生成的Web服务客户端类,没有setter
- java – 任何使用Eclipse WTP的方法,并不意味着在JSP页面更
- java – 在hibernate统计中,load和fetch之间有什么区别?
- java – 为什么我不能在ejb模块中创建RESTful Web服务?