设计模式(PatternsinJava)-htp/vww.jdon.com public class BombFactory extends Factory mple creator[ public Sample2 creator( 上例中我们只有一类产品接口 Sample,工厂方法和抽象工厂可以创建多个产品接口的实 例,比如 Sample2 Sample3 Factory Method往往只是创建单个的实例。 Abstract Factory创建一系列的实例组,这些实 例彼此相关。 举例1 下图是来自天极网”阎宏"的瓜哇语言抽象工厂创立性模式介绍中的抽象工厂图:
设计模式(Patterns in Java) -- http://www.jdon.com 11 ...... } public Sample2 creator(){ ...... } } public class BombFactory extends Factory{ public Sample creator(){ ...... } public Sample2 creator(){ ...... } } 上例中我们只有一类产品接口 Sample , 工厂方法和抽象工厂可以创建多个产品接口的实 例,比如 Sample2 Sample3 FactoryMethod 往往只是创建单个的实例。Abstract Factory 创建一系列的实例组,这些实 例彼此相关。 举例 1 下图是来自天极网" 阎宏"的 爪哇语言抽象工厂创立性模式介绍 中的抽象工厂图:
设计模式(PatternsinJava)--htp/www.jdon.com +getProducer(which String):Computer Producer nterface Creates Creates PCProducer MacRAMPCRAM +createCPU0: CPU+create CPUO: CPU +create RAM0: RAM +create RAMO: RAM Creates interface Creates MaccpU Creates 在这张图中,有两类产品接口 interface RAM和 interface CPU;同时有两个创建方 法: MacProducer和 PCProducer,这两个创建方法中都有 createCPU0和 createRAM(,返回的 实例对象组是CPU和RAM,这是分别来自两类产品接口,表面彼此是相关的因此它是抽象工 厂, 举例2 我们以Jive的 ForumFactory为例 public abstract class ForumFactory t private static Object initLock new Object O private static String className com. jivesoftware. forum. database. DbForumFactory private static ForumFactory factory null public static ForumFactory getInstance(Authorization authorization) I //If no valid authorization passed in, return nul if (authorization return null //以下使用了 Singleton单态模式 f (factory null)( synchronized (initLock) I nl1){
设计模式(Patterns in Java) -- http://www.jdon.com 12 在这张图中, 有两类产品接口 interface RAM 和 interface CPU; 同时有两个创建方 法:MacProducer和PCProducer,这两个创建方法中都有createCPU()和createRAM(),返回的 实例对象组是 CPU 和 RAM, 这是分别来自两类产品接口,表面彼此是相关的.因此它是抽象工 厂. 举例 2 我们以 Jive 的 ForumFactory 为例: public abstract class ForumFactory { private static Object initLock = new Object(); private static String className = "com.jivesoftware.forum.database.DbForumFactory"; private static ForumFactory factory = null; public static ForumFactory getInstance(Authorization authorization) { //If no valid authorization passed in, return null. if (authorization == null) { return null; } //以下使用了 Singleton 单态模式 if (factory == null) { synchronized(initLock) { if (factory == null) {
设计模式(PatternsinJava)--htp/www.jdon.com //动态转载类 Class c= Class for Name (className) factory =(ForumFactory)c newInstance O catch(Exception e)( return null //Now,返回 proxy.用来限制授权对 forum的访问 return new ForumFactoryProxy(authorization, factory factory. getPermissions(authorization)) //真正创建 forum的方法由继承 forumfac tory的子类去完成 public abstract Forum createForum(String name, String description) throws UnauthorizedException, ForumAlready ExistsException 因为现在的Jive是通过数据库系统存放论坛帖子等内容数据,如果有人要扩展为纯粹的文 件系统存放的论坛帖子,这个工厂方法 ForumFactory就提供了提供动态接口 private static String className com. jivesoftware. forum. database. Db ForumFactory 你可以使用自己开发的创建 forum的方法代替 com. jivesoftware. forum. database. DbForumFactory就可以 在上面的一段代码中一共用了三种模式,除了工厂模式外,还有 Singleton单态模式,以及 proxy模式, proxy模式主要用来授权用户对 forum的访问,因为访问 forum有两种人:一个是 注册用户一个是游客 guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统 的,因此建立一个 proxy,类似网关的概念,可以很好的达到这个效果
设计模式(Patterns in Java) -- http://www.jdon.com 13 ...... try { //动态转载类 Class c = Class.forName(className); factory = (ForumFactory)c.newInstance(); } catch (Exception e) { return null; } } } } //Now, 返回 proxy.用来限制授权对 forum 的访问 return new ForumFactoryProxy(authorization, factory, factory.getPermissions(authorization)); } //真正创建 forum 的方法由继承 forumfactory 的子类去完成. public abstract Forum createForum(String name, String description) throws UnauthorizedException, ForumAlreadyExistsException; .... } 因为现在的 Jive 是通过数据库系统存放论坛帖子等内容数据,如果有人要扩展为纯粹的文 件系统存放的论坛帖子,这个工厂方法 ForumFactory 就提供了提供动态接口: private static String className = "com.jivesoftware.forum.database.DbForumFactory"; 你可以使用自己开发的创建 forum 的方法代替 com.jivesoftware.forum.database.DbForumFactory 就可以. 在上面的一段代码中一共用了三种模式,除了工厂模式外,还有 Singleton 单态模式,以及 proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是 注册用户 一个是游客 guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统 的,因此建立一个 proxy,类似网关的概念,可以很好的达到这个效果
设计模式(PatternsinJava)--htp/www.jdon.com 好了经过上述简单描述,你对工厂模式应该有个简单的印象,如果你要钻研工厂模式,网络 上有很多英文资料,不过我觉得过分钻研也没有必要,主要是使用实践,实际使用中工厂模式 的变种很多,只要你知道这样一个大概思路,相信在实践中你会是工厂模式的设计创建高手!
设计模式(Patterns in Java) -- http://www.jdon.com 14 好了.经过上述简单描述,你对工厂模式应该有个简单的印象,如果你要钻研工厂模式,网络 上有很多英文资料,不过我觉得过分钻研也没有必要,主要是使用实践,实际使用中工厂模式 的变种很多,只要你知道这样一个大概思路,相信在实践中你会是工厂模式的设计创建高手!
设计模式(PatternsinJava)--htp/www.jdon.com 设计模式之 Prototype(原型) 定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的 细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象 通过请求原型对象拷贝它们自己来实施创建。 如何使用? 因为Java中的提供 clone o方法来实现对象的克隆(具体了解 clone o按这里),所以 Prototype模式实现一下子变得很简单 以勺子为例: public abstract class Abstract Spoon implements Cloneable String spoon Name public void setSpoonName(String spoonName) Ithis spoon Name spoon Name: public String getSpoon Name o freturn this spoon Name: public Ob ject clone o Object object null try object super clone o 3 catch(Clone Not SupportedException exception System. err println("AbstractSpoon is not Cloneable") return ob ject 有两个具体实现( ConcreteProtot ype) public class Soup Spoon extends AbstractSpoon public Soup Spoon o
设计模式(Patterns in Java) -- http://www.jdon.com 15 设计模式之 Prototype(原型) 定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype 模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的 细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象 通过请求原型对象拷贝它们自己来实施创建。 如何使用? 因为 Java 中的提供 clone()方法来实现对象的克隆(具体了解 clone()按这里),所以 Prototype 模式实现一下子变得很简单. 以勺子为例: public abstract class AbstractSpoon implements Cloneable { String spoonName; public void setSpoonName(String spoonName) {this.spoonName = spoonName;} public String getSpoonName() {return this.spoonName;} public Object clone() { Object object = null; try { object = super.clone(); } catch (CloneNotSupportedException exception) { System.err.println("AbstractSpoon is not Cloneable"); } return object; } } 有两个具体实现(ConcretePrototype): public class SoupSpoon extends AbstractSpoon { public SoupSpoon() { setSpoonName("Soup Spoon");