码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之工厂方法模式

时间:2016-11-30 23:22:17      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:设计模式之工厂方法模式

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!