设计模式(PatternsinJava)-htp/vww.jdon.com public class SaladSpoon extends AbstractSpoon public SaladSpoon O set SpoonName("Salad Spoon") 调用 Prototype模式很简单 AbstractSpoon spoon new Soup Spoon o AbstractSpoon spoon new SaladSpoon O 当然也可以结合工厂模式来创建 Abstractspoon实例。 在Java中 Prototype模式变成 clone o方法的使用,由于Java的纯洁的面向对象特性,使 得在Java中使用设计模式变得很自然,两者已经几乎是浑然一体了。这反映在很多模式上, 如 Iterator遍历模式
设计模式(Patterns in Java) -- http://www.jdon.com 16 } } public class SaladSpoon extends AbstractSpoon { public SaladSpoon() { setSpoonName("Salad Spoon"); } } 调用 Prototype 模式很简单: AbstractSpoon spoon = new SoupSpoon(); AbstractSpoon spoon = new SaladSpoon(); 当然也可以结合工厂模式来创建 AbstractSpoon 实例。 在 Java 中 Prototype 模式变成 clone()方法的使用,由于 Java 的纯洁的面向对象特性,使 得在 Java 中使用设计模式变得很自然,两者已经几乎是浑然一体了。这反映在很多模式上, 如 Interator 遍历模式
设计模式(PatternsinJava)--htp/www.jdon.com 设计模式之 Builder Builder模式定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型 和内容就可以构建它们.用户不知道内部的具体构建细节. Builder模式是非常类似抽象工 厂模式,细微的区别大概只有在反复使用中才能体会到 为何使用? 是为了将构建复杂对象的过程和它的部件解耦.注意:是解耦过程和部件. 因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮方向盘发动机 还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配 过程也很复杂(需要很好的组装技术), Builder模式就是为了将部件和组装过程分开 如何使用? 首先假设一个复杂对象是由多个部件组成的, Builder模式是把复杂对象的创建和部件的创 建分别开来,分别用 Builder类和 Director类来表示 首先,需要一个接口,它定义如何创建复杂对象的各个部件 public interface Builder //创建部件A比如创建汽车车轮 void buildPartAO //创建部件B比如创建汽车方向盘 void buildPartBO //创建部件C比如创建汽车发动机 void buildPartCO //返回最后组装成品结果(返回最后装配好的汽车) /成品的组装过程不在这里进行,而是转移到下面的 Director类中 进行 /从而实现了解耦过程和部件 Product getResulto 用 Director构建最后的复杂对象,而在上面 Builder接口中封装的是如何创建一个个部件 (复杂对象是由这些部件组成的),也就是说 Director的内容是如何将部件最后组装成成品
设计模式(Patterns in Java) -- http://www.jdon.com 17 设计模式之 Builder Builder 模式定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder 模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型 和内容就可以构建它们.用户不知道内部的具体构建细节.Builder 模式是非常类似抽象工 厂模式,细微的区别大概只有在反复使用中才能体会到. 为何使用? 是为了将构建复杂对象的过程和它的部件解耦.注意: 是解耦过程和部件. 因为一个复杂的对象,不但有很多大量组成部分,如汽车,有很多部件:车轮 方向盘 发动机 还有各种小零件等等,部件很多,但远不止这些,如何将这些部件装配成一辆汽车,这个装配 过程也很复杂(需要很好的组装技术),Builder 模式就是为了将部件和组装过程分开. 如何使用? 首先假设一个复杂对象是由多个部件组成的,Builder 模式是把复杂对象的创建和部件的创 建分别开来,分别用 Builder 类和 Director 类来表示. 首先,需要一个接口,它定义如何创建复杂对象的各个部件: public interface Builder { //创建部件 A 比如创建汽车车轮 void buildPartA(); //创建部件 B 比如创建汽车方向盘 void buildPartB(); //创建部件 C 比如创建汽车发动机 void buildPartC(); //返回最后组装成品结果 (返回最后装配好的汽车) //成品的组装过程不在这里进行,而是转移到下面的 Director 类中 进行. //从而实现了解耦过程和部件 Product getResult(); } 用 Director 构建最后的复杂对象,而在上面 Builder 接口中封装的是如何创建一个个部件 (复杂对象是由这些部件组成的),也就是说 Director 的内容是如何将部件最后组装成成品:
设计模式(PatternsinJava)-htp/vww.jdon.com public class Director I private Builder builder public Director( Builderbuilder )I this builder bui lde //将部件 parta partB partC最后组成复杂对象 //这里是将车轮方向盘和发动机组装成汽车的过程 public void constructo builder. buildPartAO builder. buildPartBO builder. buildPartCO Builder的具体实现 Concrete Builder 通过具体完成接口 Builder来构建或装配产品的部件 定义并明确它所要创建的是什么具体东西 提供一个可以重新获取产品的接口 public class ConcreteBuilder implements Builder I Part partA, partB, partC ublic void buildPartAO I //这里是具体如何构建 partA的代码 public void buildPartBO I //这里是具体如何构建 partB的代码 public void buildPartco t //这里是具体如何构建 partB的代码 public Product getResulto //返回最后组装成品结果 复杂对象:产品 Product
设计模式(Patterns in Java) -- http://www.jdon.com 18 public class Director { private Builder builder; public Director( Builder builder ) { this.builder = builder; } // 将部件 partA partB partC 最后组成复杂对象 //这里是将车轮 方向盘和发动机组装成汽车的过程 public void construct() { builder.buildPartA(); builder.buildPartB(); builder.buildPartC(); } } Builder 的具体实现 ConcreteBuilder: 通过具体完成接口 Builder 来构建或装配产品的部件; 定义并明确它所要创建的是什么具体东西; 提供一个可以重新获取产品的接口: public class ConcreteBuilder implements Builder { Part partA, partB, partC; public void buildPartA() { //这里是具体如何构建 partA 的代码 }; public void buildPartB() { //这里是具体如何构建 partB 的代码 }; public void buildPartC() { //这里是具体如何构建 partB 的代码 }; public Product getResult() { //返回最后组装成品结果 }; } 复杂对象:产品 Product:
设计模式(PatternsinJava)-htp/vww.jdon.com public interface Product I 复杂对象的部件 public interface Part I I 我们看看如何调用 Builder模式 ConcreteBuilder builder new ConcreteBuilder o Director director new Director( builder director construct o Product product builder. getResulto Builder模式的应用 在Java实际使用中,我们经常用到"池"(Poo1)的概念,当资源提供者无法提供足够的资源, 并且这些资源需要被很多用户反复共享时,就需要使用池 池″实际是一段内存,当池中有一些复杂的资源的″断肢"(比如数据库的连接池,也许有时一 个连接会中断),如果循环再利用这些"断肢”,将提高内存使用效率,提高池的性能修改 Builder模式中 Director类使之能诊断断肢"断在哪个部件上,再修复这个部件 具体英文文章见: Recycle broken objects in resource pools
设计模式(Patterns in Java) -- http://www.jdon.com 19 public interface Product { } 复杂对象的部件: public interface Part { } 我们看看如何调用 Builder 模式: ConcreteBuilder builder = new ConcreteBuilder(); Director director = new Director( builder ); director.construct(); Product product = builder.getResult(); Builder 模式的应用 在 Java 实际使用中,我们经常用到"池"(Pool)的概念,当资源提供者无法提供足够的资源, 并且这些资源需要被很多用户反复共享时,就需要使用池. "池"实际是一段内存,当池中有一些复杂的资源的"断肢"(比如数据库的连接池,也许有时一 个连接会中断),如果循环再利用这些"断肢",将提高内存使用效率,提高池的性能.修改 Builder 模式中 Director 类使之能诊断"断肢"断在哪个部件上,再修复这个部件. 具体英文文章见:Recycle broken objects in resource pools
设计模式(PatternsinJava)--htp/www.jdon.com 设计模式之 Singleton(单态) 定义 Singleton模式主要作用是保证在Java应用程序中,一个 Class只有一个实例存在。 个实例表示是单线程,在很多操作中,比如建立目录数据库连接都需要单线程操作, Singleton模式经常用于控制对系统资源的控制,我们常常看到工厂模式中工厂方法也用 Singleton模式实现的 如何使用? 一般 Singleton模式通常有几种形式 public class Singleton I private static Singleton instance new Singleton O public static Singleton getInstanceo[ return instance 调用方法: Singleton. getInstance o 第二种形式 public class Singleton I private static Singleton instance null public static Singleton getInstanceo[ if( instance==null) nstancenew Singleton O return instance 调用方法: Singleton getInstance O
设计模式(Patterns in Java) -- http://www.jdon.com 20 设计模式之 Singleton(单态) 定义: Singleton 模式主要作用是保证在 Java 应用程序中,一个 Class 只有一个实例存在。 一个实例表示是单线程,在很多操作中,比如建立目录 数据库连接都需要单线程操作, Singleton 模式经常用于控制对系统资源的控制,我们常常看到工厂模式中工厂方法也用 Singleton 模式实现的. 如何使用? 一般 Singleton 模式通常有几种形式: public class Singleton { private static Singleton _instance = new Singleton(); public static Singleton getInstance() { return _instance; } } 调用方法: Singleton.getInstance() 第二种形式: public class Singleton { private static Singleton _instance = null; public static Singleton getInstance() { if (_instance==null) _instancenew Singleton() return _instance; } } 调用方法: Singleton.getInstance()