




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java设计模式圣经连载(01)简单工厂模式 2006-12-03 14:33:04标签:java 设计模式1.1简单工厂(Simple Factory)模式简单工厂模式是类的创建,又叫静态工厂方法(Static Factory Methord)模式。简单工厂模式是由一个工厂对象决定创造哪一种产品类的实例。1.1.1工厂模式的几种形态工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态的决定将哪一个类实例化,工厂模式有以下几种形态:l简单工厂(Simple Factory)模式:又称静态工厂方法(Static Factory Methord)模式。l工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。l抽象工厂(Abstract Factory)模式:又称工具箱(Kit或Toolkit)模式。下图所示的就是简单工厂模式的简略类图。简单工厂模式,或称静态工厂方法模式,是不同工厂方法模式的一个特殊实现。在Java语言中,通常的工厂方法模式不能通过设计功能的退化给出静态工厂方法模式。1.1.2简单工厂模式的引进(一般模式)比如有一个农场,生产各种水果,有苹果(Apple)、草莓(Strawberry)、葡萄(Grape);农场的园丁(FruitGardener)要根据客户的需求,提供相应的水果。下面看看是如何用简单工厂模式实现这个过程的,如下图:此模式的实现源码如下:产品接口水果接口:Fruit.javapackage com.lavasoft.patterns.simplefactory.ybgc;/* Created by IntelliJ IDEA.* FileName:Fruit.java* User: LavaSoft* Date: 2006-12-1* Time: 0:26:51* Java与模式(-阎宏博士著)读书笔记* 工厂模式模式-简单工厂模式-一般模式* ReadMe: 抽象产品角色:工厂的水果产品接口-水果*/public interface Fruit /* * 种植 */ void plant(); /* * 生长 */ void grow(); /* * 收获 */ void harvest();产品平果类:Apple.javapackage com.lavasoft.patterns.simplefactory.ybgc;/* Created by IntelliJ IDEA.* FileName:Apple.java* User: LavaSoft* Date: 2006-12-1* Time: 0:47:25* Java与模式(-阎宏博士著)读书笔记* 工厂模式模式-简单工厂模式-一般模式* ReadMe: 水果工厂的产品:苹果*/public class Apple implements Fruit private int treeAge; /* * 种植 */ public void plant() System.out.println(Apple has been planted.); /* * 生长 */ public void grow() System.out.println(Apple is growing.); /* * 收获 */ public void harvest() System.out.println(Apple has been harvested.); /* * return 返回树龄 */ public int getTreeAge() return treeAge; /* * 设置树龄 */ public void setTreeAge(int treeAge) this.treeAge = treeAge; 产品草莓类:Strawberry.javapackage com.lavasoft.patterns.simplefactory.ybgc;/* Created by IntelliJ IDEA.* FileName:Strawberry.java* User: LavaSoft* Date: 2006-12-1* Time: 0:45:09* Java与模式(-阎宏博士著)读书笔记* 工厂模式模式-简单工厂模式-一般模式* ReadMe: 水果工厂的产品:草莓*/public class Strawberry implements Fruit /* * 生长 */ public void grow() System.out.println(Strawberry is growing.); /* * 收获 */ public void harvest() System.out.println(Strawberry has been harvested.); /* * 种植 */ public void plant() System.out.println(Strawberry has been planted.); /* * 辅助方法 */ public static void log(String msg) System.out.println(msg); 产品葡萄类:Grape.javapackage com.lavasoft.patterns.simplefactory.ybgc;/* Created by IntelliJ IDEA.* FileName:Grape.java* User: LavaSoft* Date: 2006-12-1* Time: 0:36:56* Java与模式(-阎宏博士著)读书笔记* 工厂模式模式-简单工厂模式-一般模式* ReadMe: 水果工厂的产品:葡萄*/public class Grape implements Fruit private boolean seedless; /是否有籽 /* * 种植 */ public void plant() System.out.println(Grape has been planted.); /* * 生长 */ public void grow() System.out.println(Grape is growing.); /* * 收获 */ public void harvest() System.out.println(Grape has been harvested.); /* * return 是否有籽 */ public boolean getSeedless() return seedless; /* * 有无籽的赋值方法 */ public void setSeedless(boolean seedless) this.seedless = seedless; /* * 辅助方法 */ public static void log(String msg) System.out.println(msg); 工厂园丁类:FruitGardener.javapackage com.lavasoft.patterns.simplefactory.ybgc;/* Created by IntelliJ IDEA.* FileName:FruitGardener.java* User: LavaSoft* Date: 2006-12-1* Time: 1:03:27* Java与模式(-阎宏博士著)读书笔记* 工厂模式模式-简单工厂模式-一般模式* ReadMe: 工厂类角色: 水果园丁,生产水果产品*/public class FruitGardener /* * 静态工厂方法 * param which :具体的产品名称 * return 一个水果对象 * throws BadFruitException */ public static Fruit factory(String which) throws BadFruitException if (which.equalsIgnoreCase(apple) return new Apple(); else if (which.equalsIgnoreCase(strawberry) return new Strawberry(); else if (which.equalsIgnoreCase(grape) return new Grape(); else throw new BadFruitException(Bad fruit request); 工厂异常定义类:BadFruitException.javapackage com.lavasoft.patterns.simplefactory.ybgc;/* Created by IntelliJ IDEA.* FileName:BadFruitException.java* User: LavaSoft* Date: 2006-12-1* Time: 1:04:56* Java与模式(-阎宏博士著)读书笔记* 工厂模式模式-简单工厂模式-一般模式* ReadMe: 工厂的异常处理类*/public class BadFruitException extends Exception public BadFruitException(String msg) super(msg); /调用父类的构造方法 一般工厂模式的测试类package com.lavasoft.patterns.simplefactory.ybgc;/* Created by IntelliJ IDEA.* FileName:TestApp.java* User: LavaSoft* Date: 2006-12-1* Time: 1:12:08* Java与模式(-阎宏博士著)读书笔记* 工厂模式模式-简单工厂模式-一般模式* ReadMe: 一般工厂模式的测试类*/public class TestApp /* * 测试方法 */ private void test(String fruitName) try Fruit f = FruitGardener.factory(fruitName); System.out.println(恭喜!生产了一个水果对象: + fruitName); catch (BadFruitException e) System.out.println(对不起!工厂目前不能生产你所要的产品: + fruitName); System.out.println(e.getMessage(); /输出异常信息 e.printStackTrace(); /输出异常堆栈信息 /* * 应用入口方法 */ public static void main(String args) TestApp t = new TestApp(); t.test(apple); t.test(grape); t.test(strawberry); t.test(car); /此处会抛异常,水果工厂能生产car(轿车)吗!哈哈哈哈. 测试运行结果恭喜!生产了一个水果对象:apple恭喜!生产了一个水果对象:grape恭喜!生产了一个水果对象:strawberry对不起!工厂目前不能生产你所要的产品:carBad fruit requestcom.lavasoft.patterns.simplefactory.ybgc.BadFruitException: Bad fruit requestat com.lavasoft.patterns.simplefactory.ybgc.FruitGardener.factory(FruitGardener.java:28)at com.lavasoft.patterns.simplefactory.ybgc.TestApp.test(TestApp.java:19)at com.lavasoft.patterns.simplefactory.ybgc.TestApp.main(TestApp.java:37)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:585)at ellij.rt.execution.application.AppMain.main(AppMain.java:90)Process finished with exit code 0从结果看来,有异常,是因为输入了工厂不能生产的类型car(小汽车),哈哈哈哈,果园能生产汽车吗?让幼儿园的小朋友告诉你吧!1.1.3简单工厂模式的一般性结构总结一下,从上面的简单工厂模式的实现可以看到,简单工厂模式需要实现工厂角色:园丁l抽象产品:水果接口l具体产品:苹果、葡萄、草莓l另外还一般还需要实现工厂异常类l客户类l简单工厂模式的一般性结构图如下:1.1.4简单工厂模式的实现使用接口或者抽象类实现多层次的产品结构工厂类可以有多个静态的工厂方法,分别用来生产不同的产品对象。多个工厂方法分别负责创建不同的产品对象,比如java.text.DateFormat类是其子类的工厂类,而DateFormat类就是提供了多个静态工厂方法。抽象产品角色的省略如果系统仅有一个具体产品角色产品角色的话,那么就可以省略掉抽象产品角色。省略掉抽象产品角色后的简略类图如下:下面是一个例子,工厂角色创建具体产品,源代码如下:.1产品角色:ConcreteProduct.javapackage com.lavasoft.patterns.simplefactory.gchb;/* Created by IntelliJ IDEA.* FileName:ConcreteProduct.java* User: LavaSoft* Date: 2006-12-1* Time: 2:07:48* Java与模式(-阎宏博士著)读书笔记* 工厂模式-简单工厂模式-工抽合并(工厂角色与抽象产品角色合并)* ReadMe: 具体产品类,表示单一的一类产品.*/public class ConcreteProduct public ConcreteProduct() .2工厂角色:package com.lavasoft.patterns.simplefactory.gchb;/* Created by IntelliJ IDEA.* FileName:Creator.java* User: LavaSoft* Date: 2006-12-1* Time: 1:56:43* Java与模式(-阎宏博士著)读书笔记* 工厂模式-简单工厂模式-工抽合并(工厂角色与抽象产品角色合并)* ReadMe: 具体产品类,与抽象产品角色合并,只生产单一种类产品.*/public class Creator /* * 静态工厂方法 * return 一个产品 */ public static Creator factory() return new Creator(); .3测试类package com.lavasoft.patterns.simplefactory.gchb;/* Created by IntelliJ IDEA.* FileName:TestApp.java* User: LavaSoft* Date: 2006-12-1* Time: 2:11:30* Java与模式(-阎宏博士著)读书笔记* 工厂模式-简单工厂模式-工抽合并(工厂角色与抽象产品角色合并)* ReadMe: 工抽合并测试类*/public class TestApp private void test() Creator t = Creator.factory(); System.out.println(产品成功生产!); public static void main(String args) new TestApp().test(); .4测试结果产品成功生产!Process finished with exit code 0工厂角色与抽象角色合并在有些情况下,工厂角色可以由抽象产品角色扮演。典型的应用就是java.text.DateFormat类,一个抽象产品类同时是子类的工厂,如下图所示:下面是我自己写的一个实现,源代码如下:.1抽象产品类(同时又是工厂类)package com.lavasoft.patterns.simplefactory.cxsl;/* Created by IntelliJ IDEA.* FileName:AbsProduct.java* User: LavaSoft* Date: 2006-12-3* Time: 3:23:47* Java与模式(-阎宏博士著)读书笔记* 工厂模式-简单工厂模式-工厂角色与抽象产品角色合并* ReadMe: 抽象产品类,同时又是工厂类.*/public abstract class AbsProduct static Product factory() return new Product(); .2具体产品类package com.lavasoft.patterns.simplefactory.cxsl;/* Created by IntelliJ IDEA.* FileName:Product.java* User: LavaSoft* Date: 2006-12-3* Time: 3:23:54* Java与模式(-阎宏博士著)读书笔记* 工厂模式-简单工厂模式-工厂角色与抽象产品角色合并* ReadMe: 具体产品类*/public class Product Product() .3测试类package com.lavasoft.patterns.simplefactory.cxsl;/* Created by IntelliJ IDEA.* FileName:TestApp.java* User: LavaSoft* Date: 2006-12-3* Time: 3:30:30* Java与模式(-阎宏博士著)读书笔记* 工厂模式-简单工厂模式-工厂角色与抽象产品角色合并* ReadMe: 测试类*/public class TestApp private void test() Product a = AbsProduct.factory(); System.out.println(成功创建一个产品对象!); public static void main(String args) TestApp test = new TestApp(); test.test(); .4测试结果成功创建一个产品对象!Process finished with exit code 0这个实现很简单,代码就不做详细解释了!三个角色全部合并如果在上面例子的基础上,连抽象产品角色都省略了,而工厂角色就可以与具体产品角色合并。换言之,一个产品类为自身的工厂。如下图所示:下面给出一个简单的实现例子如下:.1具体产品类package com.lavasoft.patterns.simplefactory.sshb;/* Created by IntelliJ IDEA.* FileName:ConcreteProduct.java* User: LavaSoft* Date: 2006-12-1* Time: 2:20:38* Java与模式(-阎宏博士著)读书笔记* 工厂模式-简单工厂模式-三色合一模式* ReadMe: 抽象产品,产品,工厂类 三和一后的具体产品类*/public class ConcreteProductpublic ConcreteProduct() /* * 静态工厂方法 * return 具体的产品ConcreteProduct实例 */ public static ConcreteProduct factory() return new ConcreteProduct(); .2测试类package com.lavasoft.patterns.simplefactory.sshb;/* Created by IntelliJ IDEA.* FileName:TestApp.java* User: LavaSoft* Date: 2006-12-1* Time: 2:24:22* Java与模式(-阎宏博士著)读书笔记* 工厂模式-简单工厂模式-三色合一模式* ReadMe: 测试方法*/public class TestApp /测试方法 private void test() ConcreteProduct t=ConcreteProduct.factory(); System.out.println(产品成功生产!); / public static void main(String args) new TestApp().test(); .3测试运行结果产品成功生产!Process finished with exit code 0代码很简单,不解释了。产品对象的循环使用和登记式的工厂方法这里在单例模式和多例模式中在讨论。简单工厂模式的优点和缺点.1简单工厂模式的优点核心式工厂类,工厂类决定在什么情况下创建哪一种产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅是“消费”产品。简单工厂模式通过这种做法实现了对责任的分割。.2简单工厂模式的缺点当产品类具有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,是其缺点。这个工厂类集中了所有产品创建逻辑,形成了一个无所不知的全能类(也称上帝类),如果此类出问题了,整个应用都受大影响。当产品有多个接口时,判断在什么条件下创建什么产品类实例会很困难。对于工厂来说,增加新的产品时一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户提供它们。换言之,接纳新的产品意味着修改这个工厂角色的源代码。简单工厂只在有限的程度上支持“开闭”原则。由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。这一缺点会在工厂方法模式中得到克服。简单工厂模式在Java中的应用DateFormat与简单工厂模式SAX2库中的XMLReaderFactory与简单工厂模式女娲捏土造人女娲需要用土造出一个个的人,这就是简单工厂模式的应用,类图如下:女娲是工厂角色,人是抽象产品角色,张三李四是产品。具体实现就不在给出了,参看园丁生产水果的例子。简单工厂模式到此结束,完成时间为2006年12月3日星期日4时24分43秒。上一篇:Java设计模式圣经连载之(00)前言 下一篇:Java设计模式圣经连载(02)工厂方法(Factory Method)模式 Java设计模式圣经连载(02)工厂方法(Factory Method)模式 2006-12-05 00:35:08标签:java 设计模式1.2工厂方法(Factory Method)模式 工厂方法模式是类的创建模式,又叫虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。 工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际工作推迟到子类中。1.2.1工厂方法模式的引进 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。下面是工厂方法模式的缩略类图: 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做。这个核心工厂则变为抽象工厂角色,仅负责给出具工厂子类必须实现的接口,而不接触哪一产品创建的细节。 这种抽象的结果,使这种工厂方法模式可以用来允许系统不修改具体工厂角色的情况下引进新产品,这一特点无疑使得工厂模式具有超过简单工厂模式的优越性。1.2.2工厂方法模式的结构 在工厂方法模式中,一般都有一个平行的等级结构,也就是说工厂和产品是对应的的。抽象工厂对应抽象产品,具体工厂对应具体产品。简单的示意图如下: 从上图可以看出,工厂方法模式的系统涉及到了以下角色: 抽象工厂角色:与应用程序无关,任何在模式中创建对象的工厂必须实现这个接口。 具体工厂角色:实现了抽象工厂接口的具体Java类,含有与引用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。 抽象产品角色:工厂方法所创建产品对象的超类型,也就是产品对象的共同父类或共同拥有的接口。 具体产品角色:这个角色实现了抽象产品角色所声名的接口。工厂方法所创建的每个具体产品对象都是某个具体产品角色的实例。1.2.3工厂方法模式在农场系统中的实现背景 在简单工厂模式中,有个全能的园丁,控制所有作物的种植、生长和收获。现在农场规模变大了,管理更加专业化了。过去全能的园丁没有了,每一种作物都有专门的园丁管理,形成了规模化和专业化生产。系统设计机构图实现源码.1水果产品接口Fruit.javapackage com.lavasoft.patterns.factorymethod.ybms;/* Created by IntelliJ IDEA.* FileName:Fruit.java* User: LavaSoft* Date: 2006-12-3* Time: 17:25:48* Java与模式(-阎宏博士著)读书笔记* 工厂模式-工厂方法模式-一般性模式(农场应用)* ReadMe: 水果接口*/public interface Fruit /* * 种植 */ void plant(); /* * 生长 */ void grow(); /* * 收获 */ void harvest();.2具体产品苹果Apple.javapackage com.lavasoft.patterns.factorymethod.ybms;/* Created by IntelliJ IDEA.* FileName:Apple.java* User: LavaSoft* Date: 2006-12-1* Time: 0:47:25* Java与模式(-阎宏博士著)读书笔记* 工厂模式-工厂方法模式-一般性模式(农场应用)* ReadMe: 水果工厂的产品:苹果*/public class Apple implements Fruit private int treeAge; /* * 种植 */ public void plant() System.out.println(Apple has been planted.); /* * 生长 */ public void grow() System.out.println(Apple is growing.); /* * 收获 */ public void harvest() System.out.println(Apple has been harvested.); /* * return 返回树龄 */ public int getTreeAge() return treeAge; /* * 设置树龄 */ public void setTreeAge(int treeAge) this.treeAge = treeAge; .3具体产品葡萄:Grape.javapackage com.lavasoft.patterns.factorymethod.ybms;/* Created by IntelliJ IDEA.* FileName:Grape.java* User: LavaSoft* Date: 2006-12-1* Time: 0:36:56* Java与模式(-阎宏博士著)读书笔记* 工厂模式-工厂方法模式-一般性模式(农场应用)* ReadMe: 水果工厂的产品:葡萄*/public class Grape implements Fruit private boolean seedless; /是否有籽 /* * 种植 */ public void plant() System.out.println(Grape has been planted.); /* * 生长 */ public void grow() System.out.println(Grape is growing.); /* * 收获 */ public void harvest() System.out.println(Grape has been harvested.); /* * return 是否有籽 */ public boolean getSeedless() return seedless; /* * 有无籽的赋值方法 */ public void setSeedless(boolean seedless) this.seedless = seedless; /* * 辅助方法 */ public static void log(String msg) System.out.println(msg); .4具体产品草莓:Strawberry.javapackage com.lavasoft.patterns.factorymethod.ybms;/* Created by IntelliJ IDEA.* FileName:Strawberry.java* User: LavaSoft* Date: 2006-12-1* Time: 0:45:09* Java与模式(-阎宏博士著)读书笔记* 工厂模式-工厂方法模式-一般性模式(农场应用)* ReadMe: 水果工厂的产品:草莓*/public class Strawberry implements Fruit /* * 生长 */ public void grow() System.out.println(Strawberry is growing.); /* * 收获 */ public void harvest() System.out.println(Strawberry has been harvested.); /* * 种植 */ public void plant() System.out.println(Strawberry has been planted.); /* * 辅助方法 */ public static void log(String msg) System.out.println(msg); .5水果工厂接口:FruitGardener.javapackage com.lavasoft.patterns.factorymethod.ybms;/* Created by IntelliJ IDEA.* FileName:FruitGardener.java* User: LavaSoft* Date: 2006-12-3* Time: 17:22:52* Java与模式(-阎宏博士著)读书笔记* 工厂模式-工厂方法模式-一般性模式(农场应用)* ReadMe: 水果工厂接口*/public interface FruitGardener /* * 工厂方法 * * return 水果 */ public Fruit factory();.6苹果工厂:AppleGardener.javapackage com.lavasoft.patterns.factorymethod.ybms;/* Created by IntelliJ IDEA.* FileName:AppleGardener.java* User: LavaSoft* Date: 2006-12-3* Time: 17:45:29* Java与模式(-阎宏博士著)读书笔记* 工厂模式-工厂方法模式-一般性模式(农场应用)* ReadMe: 苹果工厂方法*/public class AppleGardener implements FruitGardener /* * 工厂方法 * * re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年B公司新型材料研发与应用合作协议
- 2025年度绿色住宅自来水管道铺设与环保验收合同
- 2025生物技术临床应用转化合作合同样本
- 2025年新型教育资源共享平台会员入学体验合同模板
- 2025年耐腐蚀门头定制、安装及维护保养综合服务合同
- 2025年度白酒产业联盟展会参展权益及资源共享合同
- 银行信贷管理试题及答案
- 银行消防培训试题及答案
- 银行年检考试题库及答案
- 自考专业(公共关系)考试综合练习含完整答案详解(夺冠)
- 五星级酒店总投资估算表及其投资占比
- 【小学体育教学中学生自主学习研究-以S区小学为例(附量表)21000字(论文)】
- 【初中数学】你有多少种画平行线的方法课件 2023-2024学年人教版数学七年级下册
- 网络安全培训试题附有答案
- 尿红细胞形态分析报告
- 网络产品行业报告
- 中药热奄包在皮肤瘙痒中的临床应用观察
- 监理人员考勤表
- 全国各气象台站区站号及经纬度
- 鼻外伤医学专业知识
- 风力发电站吊篮施工
评论
0/150
提交评论