zoukankan      html  css  js  c++  java
  • [设计模式-创建型]工厂方法(Factory Method)

    概括

    名称 Factory Method
    结构

    动机

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

    适用性

    • 当一个类不知道它所必须创建的对象的类的时候。

    • 当一个类希望由它的子类来指定它所创建的对象的时候。

    • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

    解析

    工厂方法模式在网络上有一个形象的比喻:

    FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了

    工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

        1.Product
          定义工厂方法所创建的对象的接口。

        2.ConcreteProduct
          实现Product接口。

        3.Creator
          声明工厂方法,该方法返回一个Product类型的对象*
          Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。
          可以调用工厂方法以创建一个Product对象。

        4.ConcreteCreator
          重定义工厂方法以返回一个ConcreteProduct实例。



    实例

    可能看到这里还是不是很清楚。直接看例子好了。涉及的文件有

    Product.java

       - SoftwareProduct.java

       -  HardwareProduct.java

    Creator.java

       -  HardwareCreator.java

       -  SoftwareCreator.java

    TestMain.java

    在Product 里定义了一个接口方法 doWork(), SoftwareProduct和HardwareProduct分别实现了这个方法。

    Creator里定义了一个接口方法getProduct(),SoftwareCreator和HardwareCreator分别实现了这个方法得到不同的 Product.


    /**   
    * @author oscar999   
    * @date 2013-7-17
    * @version V1.0   
    */
    package designptn.factorymth;
    
    public interface Product {
       void doWork();
    }
    
    /**   
     * @author oscar999   
     * @date 2013-7-17
     * @version V1.0   
     */
    package designptn.factorymth;
    
    public class SoftwareProduct implements Product {
    	public void doWork() {
    		System.out.println("product a Software.");
    	}
    }
    
    /**   
     * @author oscar999   
     * @date 2013-7-17
     * @version V1.0   
     */
    package designptn.factorymth;
    
    public class HardwareProduct implements Product {
    	public void doWork() {
    		System.out.println("product a Hardware.");
    	}
    }
    
    /**   
    * @author oscar999   
    * @date 2013-7-17
    * @version V1.0   
    */
    package designptn.factorymth;
    
    public class SoftwareCreator implements Creator {
    
    	public Product getProduct() {
    		return new SoftwareProduct();
    	}
    
    }
    
    /**   
     * @author oscar999   
     * @date 2013-7-17
     * @version V1.0   
     */
    package designptn.factorymth;
    
    public class HardwareCreator implements Creator {
    	public Product getProduct() {
    		return new HardwareProduct();
    	}
    }
    
    /**   
     * @author oscar999   
     * @date 2013-7-17
     * @version V1.0   
     */
    package designptn.factorymth;
    
    public class TestMain {
    
    	public static void main(String[] args) {
    		Creator softwareCreator = new SoftwareCreator();
    		Product softwareProduct = softwareCreator.getProduct();
    		softwareProduct.doWork();
    
    		Creator hardwareCreator = new HardwareCreator();
    		Product hardwareProduct = hardwareCreator.getProduct();
    		hardwareProduct.doWork();
    	}
    
    }
    

    从Main 函数的调用来看, 通过不同的Creator,可以得到不同的Product, 而不需要关心具体的Product 是什么样的。



  • 相关阅读:
    1系统负荷
    动画
    日常问题记录--JSP页面中通过<s:property value="#parameters.userName[0]>获取URL参数中文时为乱码的解决办法
    linux下替换一个文件中的所有中文字符的方法
    日常问题记录--getJSON函数不执行回调函数的原因总结
    日常问题记录-- java.util.NoSuchElementException
    日常问题记录--POST时,struts2的 request.getParameter找不到参数
    日常问题记录--nested exception is java.lang.NoClassDefFoundError: org/apache/oro/text/regex/MalformedPatternExcept
    mysql系统搭建互备DB(双主)记录
    使用forEach函数绑定函数的上下文
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3196699.html
Copyright © 2011-2022 走看看