标签:设计模式之工厂方法模式
anticipate 预料 = except ant蚂蚁 ic ic卡 ip ip卡 ate吃 我没有预料到小蚂蚁把我的ic,ip卡吃掉了。 robust 强壮的 = strong ro rong容祖儿 bu不 st石头 容祖儿不喜欢强壮的石头。 maintain 维持 = keep main主要的(大陆) tain 台湾 大陆和台湾维持着若即若离的关系。 设计模式之工厂方法模式 动机: 一个工厂方法factory method定义了一个接口来创建对象,但是让子类去选择创建哪一个,在运行时创建。一个关于factory method的简单生活例子就是宾馆。进入酒店首先你要登记,前台会在你付钱后给你房间的钥匙,这种方式你可以看做room factory。当你待在宾馆,你肯能需要打电话,你叫前台,前台帮你拨打你要打的号码,就是phone-call factory,因为前台控制着电话的访问。 目的: 定义一个接口来创建对象,但是让子类去决定实例化哪一个种。 实现: 上图的类:--Product: 定义了factory method创建的对象接口 --Concrete Product: 实现Product接口 --Creator : 声明factory method方法,返回一个Product类,可能调用抽象mehtod来创建 Product对象 --Concrete Creator: 重写抽象方法来创想具体的Product类 public interface Product { } public abstract class Creator { public void anOperation() { Product product = factoryMethod(); } protected abstract Product factoryMethod(); } public class ConcreteProduct implements Product { } public class ConcreteCreator extends Creator { protected Product factoryMethod() { return new ConcreteProduct(); } } public class Client { public static void main( String arg[] ) { Creator creator = new ConcreteCreator(); creator.anOperation(); } } 应用举例: 实现工厂方法factory method的需求是频繁的,如下情况:当一个类不知道它要创建的类型。当一个类想要子类去详细说明一个新的类型。 Example 1: 考虑一个桌面应用。很多地方要用到文档。一个桌面应用包括一些操作,例如:打开,创建,保存文档。基本类用来抽象,命名应用和文档。客户端不得不使用它们去创建子类来定义它们自己的应用和文档。比如生成一个绘画应用,需要定义绘画应用drawingApplication和绘画文档drawingDocument类,这些应用类的任务是管理文档类,从客户端接收请求去处理(比如从菜单中接收打开或者保存命令)。 由于文档类需要被应用类实例化,应用类不知道文档的类型,但是它知道什么时候去实例化。这个框架需要去实例化具体的文档类,但是它仅仅知道不能实例化的抽象类。 Factory method模式通过把所有的信息给需要实例化文档类对象,在框架外部使用文档类对象的类,正如下面我们看到的: 在这个application class应用类,CreateDocument方法或者有一个默认的实现,或者不实现,让子类MyApplication去创造一个MyDocument public Document CreateDocument(String type){ if (type.isEqual("html")) return new HtmlDocument(); if (type.isEqual("proprietary")) return new MyDocument(); if (type.isEqual("pdf")) return new PdfDocument (); } CreateDocument()方法将会被MyApplication继承,所以它会实例化一个MyDocument对象。我们称CreateDocument()为Factory method工厂方法,因为它负责去创建一个对象。通过这个方法去重新定义一个Appliction的子类,从这一点来看Factory method模式,这个模式符合依赖反转选择。 问题及解决方案:使用Factory method模式有一些问题: 定义Creator class 如果我们在已经写好的代码上去应用Factory method模式,可能有两种情况: 1、Creator类是抽象的,generating方法没有任何实现,这种情况,ConcreteCreator具体的creator类必须重定义。 2、Creator类是具体的,generating方法有一个默认的实现,如果是这样,ConcreteCreator将使用默认的实现,而不是继承。 Factory method只是工厂模式的一个特殊例子,在现代编程语言里面,使用注册器registration的工厂模式使用的更多。 坏处和好处:好处: 1、分割应用和类,在应用中用弱连接代替强连接,这样可以简单的方法和最小的改变去扩展Product 2、提供个性化的钩子,当一个对象直接在类里面被创建,很难被继承它的对象去代替。使用工厂模式就很轻易的代替原始的对象。 坏处:工厂模式被具有family特性,可继承的类使用,如果类没有相同的基础类或继承,就不能使用工厂模式。 热点: 工厂模式是广泛使用的模式,也是更强壮的设计模式之一,当你使用factory method的时候,有一些地方需要考虑: 考虑你确实需要工厂模式去创建对象。也许使用工厂模式会带来没必要的复杂。不管怎样,如果你有很多类有共同的基本类型,并且你把他们当做抽象类来操作,你需要使用工厂模式。如果你有很多如下的代码,好好考虑他们: if (genericProduct typeof ConcreteProduct) ((ConcreteProduct)genericProduct).doSomeConcreteOperation();
本文出自 “不死的小强” 博客,请务必保留此出处http://qianray.blog.51cto.com/4607992/1878314
标签:设计模式之工厂方法模式
原文地址:http://qianray.blog.51cto.com/4607992/1878314