现在的位置: 首页 > 综合 > 正文

Factory 模式

2013年07月30日 ⁄ 综合 ⁄ 共 3115字 ⁄ 字号 评论关闭

解决实现依赖.[用Factory创建的对象,它的实现细节可能是不断变化的,但是它必须有一个稳定的接口]

Factory模式
 利用给Factory对象传递不同的参数,以返回具有相同基类或实现了同一接口的对象。
Abstract Factory模式
先利用Factory模式返回具体Factory对象,在通过Factory对象返回不同的对象 

那里变化,就封装那里.[变化点在对象创建]

new Road();Road 可能从泥泞路,到柏油大道,再到高速公路.

用factory 把 new Road 封装起来,当你的路升级了,你就只要改这一个地方. 

如果没有变化,当然就不用封装了.

new String(); ?? 需呀封装吗?

面向接口编程,被创建的对象最好是某个Interface的实现.[这个interface是相对稳定的]

1,Factory模式同一个factory 创建实现一个interface的不同实现,客户端和Factory是松耦合的.

[应对对象实现不断发生变化的问题]
如: SAXParserFactory.
factoryImplName = System.getProperty("javax.xml.parsers.SAXParserFactory");
Class clazz = Class.forName(factoryImplName);
factoryImpl = (SAXParserFactory)clazz.newInstance();
根据运行时侯属性来决定用什么样的实例.

 

2,Abstract Factory模式,同一类interface由一个factory创建,客户端和Factory是耦合的.如下例. 
[依赖只限于下图中红色的部分,应对多系列对象之间关系不断发生变化的问题,如下图producta 和productb有相互关系]

Abstract Factory模式定义了如何实例化一组对象系列,这些对象可能相关可能互为利用。客户在创建的时候无须指定这些对象属于什么类型,它只需关注是谁生产的。具体生产出来的一系列对象的细节和类别则由某个工厂负责。

    使用范围

    系统需要独立于组成它的对象系列的创建、组织和表现的时候
    需要组合一系列的对象,这些对象作为整体作用于一个系统的时候
    使用方法

    考察抽象工厂的类图

 
 
    AbstractFactory类是一个系统的抽象,称之为工厂,该工厂可能多个包含细节的子类。每个工厂都必须生产同一个系列的产品组,这里为AbstractProductA和AbstractProductB。然而,每一个工厂的系列产品又有不同的实现方法或表现方法。因此ConcreteFactory1生产ProductA1和ProductA2,ConcreteFactory2生产ProductB1和ProductB2。
    举例说明
    假设我们要在一个应用程序中创建一个Button和一个Textbox。对于不同的系统可能创建不一样的这两个对象,Linux下的和Windows环境下的。
    public abstract class Button {
        protected abstract void createShape();
    }
    public abstract class Textbox {
        protected abstract void createText();
    }
    在Linux环境下创建Button和Textbox的实现细节
    public class LinuxButton extends Button{
        protected void createShape() {
            System.out.println("create Linux Button");
        }
    }
    public class LinuxTextbox extends Textbox{
        protected void createText() {
            System.out.println("create linux textbox");
        }
    }
    在Windows环境下创建Button和Textbox的实现细节
    public class WindowsButton extends Button{
        protected void createShape() {
            System.out.println("create windows button");
        }
    }

 

   public class WindowsTextbox extends Textbox{
        protected void createText() {
            System.out.println("create windows textbox");
        }
    }
    这里是一个抽象工厂类,需要完成创建Button和Textbox的方法
    public abstract class Factory {
        Button button;
        Textbox textbox;
        public abstract void createButton();
        public abstract void createTextbox();
    }
    Linux下的工厂角色
    public class LinuxFactory extends Factory{
        public void createButton() {
            button = new LinuxButton();
            button.createShape();
        }
        public void createTextbox() {
            textbox = new LinuxTextbox();
            textbox.createText();
        }
    }
    Windows下的工厂角色
    public class WindowsFactory extends Factory{
        public void createButton() {
            button = new WindowsButton();
            button.createShape();
        }
        public void createTextbox() {
            textbox = new WindowsTextbox();
            textbox.createText();
        }
    }
    到此为止,一个抽象工厂模式创建完毕。类结构图如下:
 
    客户端的使用方法为:
    public class Client {
        public static void main(String args[]){
            Factory factory = new LinuxFactory();
            factory.createButton();
            factory.createTextbox();
            factory = new WindowsFactory();
            factory.createButton();
            factory.createTextbox();
        }
    }

抱歉!评论已关闭.