工厂方法(Factory Method)模式

来源:互联网 发布:codec实现了什么算法 编辑:程序博客网 时间:2024/05/10 03:09

     在创建类时,通常可以同时定义多个构造方法,然后让它们创建类的实例。然而有时候,客户代码虽然需要某个对象,却并不关心或者不需要关心这个对象究竟是由哪个类创建而来的。
     工厂方法模式的意图是定义一个用于创建对象的接口,并控制返回哪个类的实例。
     迭代器(Iterator)模式提供了用于顺序访问容器中的各个元素的方法。但是,迭代器实例却经常需要运用工厂方法模式来创建。java JDK1.2引进了一个容器类接口,其中包含了一个iterator()方法,所有容器类均实现了该方法,它使得调用者并不知道iterator对象是哪个类实例化的。
    工厂方法模式使得客户代码无须关心使用哪个类的实例。
    工厂方法模式不仅要求有一个能够创建新对象的方法,还要让客户端代码无须了解具体实例化的类。工厂方法模式通常包含若干个类,这些类实现了相同的操作,返回了相同的抽象类型,然而这些操作的内部,实际上却实例化了不同的类,并且,这些类都实现了上述抽象类型。当客户代码请求一个新对象时,这个新对象该由哪个类实例化,取决于工厂对象接受创建请求时的行为。
    在早期的信贷授权系统中,开发一个名为CreditCheckOnline的类,用于在线核对系统是否允许为客户提供信用额度。
    开发时,你意识到信贷代理机构有时并不在线。此时项目分析者认为你需要为呼叫中心的代理建立一个对话框,通过设置一些问题使其自动做出信贷决定。因此,你创建了CreditCheckOffline类,使它能够根据某些规定被使用。最初,你的类实际如图所示。其中,creditLimit()方法接受客户的身份证号码,返回此客户的信贷限额。
    你这样设计的类,不管信贷代理机构是否在线,你都可以为客户提供信贷限额信息。现在的问题是,这些类的使用者需要知道究竟实例化了哪个类。然而,事实上却只有你知道信贷代理机构是否在线。

                                                         
    在这种场景下,需要把创建对象的工作转交给一个接口,来完成实例化的控制。一种解决方案是让这两个类同时实现一个标准接口,并创建一个工厂方法来返回该接口的某个实例。具体做法如下:
    创建一个名为CreditCheck的接口,使其包含creditLimit()方法。在实现createCreditCheck()方法时,通过掌握的信贷代理机构是否在线的信息,你可以决定究竟实例化哪一个类。

                                                     

0 0
原创粉丝点击