java設計模式之創建型模式-FactoryMethod ( 工廠方法 )

有感於設計模式在日常開發中的重要性,同時筆者也自覺對設計模式小有心得,故筆者寫23種設計模式的簡單例子、並整理23種設計模式的理論部分,綜合彙總成這份Java設計模式,希望對大家有所幫助。

         本份博客主要是爲了向讀者介紹23種設計模式,包括模式的描述,適用性,模式的組成部分,並附帶有簡單的例子和類,目的是爲了讓讀者瞭解23種設計模式,並能方便的查閱各種設計模式的用法及注意點。

         所附的例子非常簡單,慢慢的引導讀者從淺到深瞭解設計模式,並能從中享受設計的樂趣。由於每個人對設計模式的理解都不盡一致,因此,可能本文檔的例子有不恰當的地方,還望各位讀者指出不恰當的地方。

在創建模式中一共有:FactoryMethod ( 工廠方法 ) 、AbstractFactory( 抽象工廠 ) 、Singleton ( 單態模式 ) 、Builder ( 建造者模式 ) 、Prototype ( 原型模式 ) 五種,也是最常用的五種設計模式。

首先介紹FactoryMethod ( 工廠方法 ) 。在FactoryMethod ( 工廠方法 ) 中首先定義一個用於創建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例化延遲到其子類。

FactoryMethod ( 工廠方法 ) 的適用性:

   1.當一個類不知道它所必須創建的對象的類的時候。

    2.當一個類希望由它的子類來指定它所創建的對象的時候。

    3.當類將創建對象的職責委託給多個幫助子類中的某一個,並且你希望將哪一個幫助子類是代理者這一信息局部化的時候。                          

  FactoryMethod ( 工廠方法 ) 的參與者: 

    1.Product

      定義工廠方法所創建的對象的接口

     2.ConcreteProduct

      實現Product接口。

    3.Creator

      聲明工廠方法,該方法返回一個Product類型的對象。Creator也可以定義一個工廠方法的缺省實現,它返回一個缺省的ConcreteProduct對象。可以調用工廠方法以創 建一個Product對象。

    4.ConcreteCreator

      重定義工廠方法以返回一個ConcreteProduct實例。

FactoryMethod ( 工廠方法 ) 的類圖:


FactoryMethod ( 工廠方法 )例子:

product

package com.juluce.factoryMethod;

/** 
 * <b>Application name:</b> FactoryMethod.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b>  <br>
 * <b>Date:</b>2013-5-23<br>
 * @author 江南漁翁
 * @version $Revision$
 */
public interface Work {
    public void doWork();
}

ConcreteProduct

package com.juluce.factoryMethod;

/**
 * <b>Application name:</b> StudentWork.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b> <br>
 * <b>Date:</b>2013-5-23<br>
 * 
 * @author 江南漁翁
 * @version $Revision$
 */
public class StudentWork implements Work {

    /**
     * {方法功能中文描述}
     * 
     * @author:江南漁翁
     */

    @Override
    public void doWork() {
	System.out.println("學生做作業!");
    }
}

package com.juluce.factoryMethod;

/**
 * <b>Application name:</b> TeacherWork.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b> <br>
 * <b>Date:</b>2013-5-23<br>
 * 
 * @author 江南漁翁
 * @version $Revision$
 */
public class TeacherWork implements Work {

    /**
     * {方法功能中文描述}
     * 
     * @author:江南漁翁
     */

    @Override
    public void doWork() {
	System.out.println("老師審批作業!");
    }
}

Creator

package com.juluce.factoryMethod;

/**
 * <b>Application name:</b> IWorkFactory.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b> <br>
 * <b>Date:</b>2013-5-23<br>
 * 
 * @author 江南漁翁
 * @version $Revision$
 */
public interface IWorkFactory {
    public Work getWork();
}

ConcreteCreator

package com.juluce.factoryMethod;

/**
 * <b>Application name:</b> StudentWorkFactory.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有 ©<br>
 * <b>Company:</b> <br>
 * <b>Date:</b>2013-5-23<br>
 * 
 * @author 江南漁翁
 * @version $Revision$
 */
public class StudentWorkFactory implements IWorkFactory {

    /**
     * {方法功能中文描述}
     * 
     * @return
     * @author:江南漁翁
     */

    @Override
    public Work getWork() {
	return new StudentWork();
    }
}

package com.juluce.factoryMethod;

/**
 * <b>Application name:</b> TeacherWorkFactory.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b> <br>
 * <b>Date:</b>2013-5-23<br>
 * 
 * @author 江南漁翁
 * @version $Revision$
 */
public class TeacherWorkFactory implements IWorkFactory {

    /**
     * {方法功能中文描述}
     * 
     * @return
     * @author:江南漁翁
     */

    @Override
    public Work getWork() {
	return new TeacherWork();
    }
}

Test

package com.juluce.factoryMethod;

/**
 * <b>Application name:</b> Test.java <br>
 * <b>Application describing:</b> <br>
 * <b>Copyright:</b>Copyright © 2013 江南漁翁 版權所有。<br>
 * <b>Company:</b> <br>
 * <b>Date:</b>2013-5-23<br>
 * 
 * @author 江南漁翁
 * @version $Revision$
 */
public class Test {
    public static void main(String[] args) {
	IWorkFactory studentWorkFactory = new StudentWorkFactory();
	Work studentWork = studentWorkFactory.getWork();
	studentWork.doWork();

	IWorkFactory teacherWorkFactory = new TeacherWorkFactory();
	Work teacherWork = teacherWorkFactory.getWork();
	teacherWork.doWork();
    }
}

result

學生做作業!

老師審批作業!

 

形象比喻:

FACTORY METHOD—請MM去麥當勞喫漢堡,不同的MM有不同的口味,要每個都記住是一件煩人的事情,我一般採用FactoryMethod模式,帶着MM到服務員那兒,說“要一個漢堡”,具體要什麼樣的漢堡呢,讓MM直接跟服務員說就行了。

工廠方法模式:核心工廠類不再負責所有產品的創建,而是將具體創建的工作交給子類去做,成爲一個抽象工廠角色,僅負責給出具體工廠類必須實現的接口,而不接觸哪一個產品類應當被實例化這種細節。 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章