• [设计模式-创建型]工厂方法(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 是什么样的。



  • 相关阅读:
    [转载]使用消息队列实现分布式事务-公认较为理想的分布式事务解决方案
    【异常】Error: ERROR 1012 (42M03): Table undefined. (state=42M03,code=1012)
    hbase极度不稳定问题,经常的RIT问题
    ERROR: Version file does not exist in root dir hdfs://XXXXXXX:8020/tmp/hbase-hbase/hbase
    su无法切换一个普通用户hbase
    配置了ssh免密登录,仍然需要输入密码
    异常-Phoenix HBASE Last region should end with an empty key. You need to create a new region and regioninfo in HDFS to plug the hole
    Hbase Region in transition问题解决
    异常-Maxwell无法全量同步触发
    异常-No suppression parameter found for notification
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3196699.html
Copyright © 2020-2023  润新知