程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 對《Java與模式》中工廠方法模式的異議

對《Java與模式》中工廠方法模式的異議

編輯:關於JAVA

關於工廠方法的一點討論,我們知道工廠方法屬於類型創建模式,而抽象工廠屬於對象創建模式,並且所謂的類創建模式就是把創建工作延遲到子類,而對象創建模式則將延遲到另一個對象。

並且設計模式中指出,類模式處理類和子類子間的關系,這些關系通過繼承建立,是靜態的,在編譯時刻便確定下來。對象模式則處理對象之間的關系,是動態的,運行時刻是可以變化的,更具動態性。

工廠方法由於屬於類型創建模式,因此它的創建工作由子類完成,而不是使用對象進行創建,並且在《設計模式》中工廠方法的動機一節有一個示例,它的類大致如下:

//抽象產品,可以是接口或者抽象類
public abstract class document {
public void open(){
...............
...............
}
public void close(){
...............
...............
}
public void save();
}
//具體的產品,
public class Mydocument extends document{
public void open(){
.............
..............
}
  ...............
  }
我們工廠方法
public abstract class appliaction {
//該方法是工廠方法,由子類實現
public abstract document createDocument();
  //模板方法,在方法中使用了工廠方法
pubic void newDocument(){
//使用工廠方法,獲得doc,而實際有子類完成,//這裡可以看出,對象的創建,是通過繼承來實現,是靜態的,編譯時已經確定//而不是通過對象的委托來實現,故屬於類創建型模式
Document doc=createDocument();
doc.open();
....................
doc.save();
}
}

具體的工廠實現由子類來實現工廠方法:

public class myappliaction extends appliaction {
public document createDocument(){
return new Mydocument();
}
}

大家可以看出,這其實使用template method模式,抽象方法聲明創建對象,而模板方法完成業務邏輯,她使用抽象創建方法,由繼承來獲得產品,而不是使用對象來創建對象的。

並且大家仔細看<設計模式>71頁的結構圖,裡的creator裡有兩個方法,其中一個使用factorymethod方法,另外一個就是普通的方法,anOperation它調用了工廠方法,product=factorymethod()來獲得產品對象。

現在問題就出現在這裡,而另外一本書閻宏的《java與模式》的167地結構圖中卻沒有把這點作出標記,並且提供的示例,也不像最初<設計模式>中的工廠方法的例子,

他的示例如下:

//抽象工廠,而這裡卻沒有方法使用工廠方法:
public interface Creator{
/**
* 工廠方法
*/
public Product factory();
}
  public class ConcreteCreator1 implements Creator
{
/**
* 工廠方法
*/
public Product factory()
{
return new ConcreteProduct1();
}
}

而客戶端卻使用;

public static void main(String[] args){
creator1 = new ConcreteCreator1();
prod1 = creator1.factory();
}

我感覺這樣示例有問題,或者不妥,或者不能表達原意。

在客戶端,他的對象創建使用了

prod1 = creator1.factory();

這樣顯然使用對象creator1來創建對象的,而不是使用繼承,類模式來完成創建的。這與工廠方法的原意,類模式,把創建工廠延遲到子類實現,等有沖突。

這樣想對象創建模式。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved