實驗:JAVA設計模式(一):工廠方法模式
作者:強官濤   類型:Java開發    類別:實驗   日期:2017-12-08    閱讀:8869 次   消耗積分:0 分

設計模式(Design patterns)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性(From百度百科)。一個設計模式是針對某一類問題的解決方案,而且已經成功的應用于許多的設計中。設計模式分為三種類型,共23種。

創建型模式:單例模式、抽象工廠模式、建造者模式、工廠方法模式、原型模式。

結構型模式:適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。

行為型模式:模版方法模式、命令模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式(Interpreter模式)、狀態模式、策略模式、職責鏈模式(責任鏈模式)、訪問者模式。今天簡單介紹下工廠方法模式。

工廠方法模式定義了一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法讓一個類的實例化延遲到其子類。它屬于創建型模式。

得到一個類的子類實例,最常用的方法是使用new關鍵字調用子類的構造方法,但是為了不讓代碼的耦合性太高或者用戶不知道該類有哪些子類,這種情況下就可以使用工程方法模式來設計系統。

工廠方法模式的結構中包括四種角色,分別是抽象產品,具體產品,抽象工廠,具體工廠。抽象產品角色由抽象類(或者接口)擔任,負責定義具體產品必須擁有的行為。具體產品是一個非抽象類,它是抽象產品的子類(或者實現類)。創建者是一個抽象類(或者接口),負責定義工廠類。具體創建者是抽象創建者的非抽象子類(或者實現類)。工廠方法模式的UML圖如下。注:圖片來自百度百科。

現在假設有如下場景。一個工廠,負責生產鉛筆(pencil)、圓珠筆(ballpen)、簽字筆(signpen)。定義抽象產品(筆)的接口Pen,具體產品Pencil(鉛筆)、Ballpen(圓珠筆)、Signpen(簽字筆);定義工廠類PenFactory。簡單工廠方法模式的代碼實現如下。

產品接口:

/**
* 筆類的接口
* @author Vencoln
*
*/
public interface Pen {
 
/**
* 書寫
* @param mesage
*/
public abstract void write(String msg);
}


具體產品類:

/**
* 鉛筆類
* @author Vencoln
*
*/
public class Pencil implements Pen {
 
/**
* 打印出msg的信息
*/
@Override
public void write(String msg) {
System.out.println("鉛筆書寫內容:" + msg);
}
}
 
/**
* 圓珠筆
* @author Vencoln
*
*/
public class Ballpen implements Pen {
@Override
public void write(String msg) {
System.out.println("圓珠筆書寫內容:" + msg);
}
}
 
/**
* 簽字筆
* @author Vencoln
*
*/
public class Signpen implements Pen {
 
@Override
public void write(String msg) {
System.out.println("簽字筆書寫內容:" + msg);
}
}


工廠類:

/**
* 工廠類
* @author Vencoln
*
*/
public class PenFactory {
 
/**
* 生產產品
* @param type
* @return
*/
public Pen produce(String type){
if(type.equals("pencil")){  //實例鉛筆
return new Pencil();
} else if(type.equals("ballpen")){
return new Ballpen();
} else if (type.equals("signpen")){
return new Signpen();
} else {
System.out.println("您輸入的產品類型不存在");
return null;
}
}
}


用戶:

public class User {
 
/**
* @param args
*/
public static void main(String[] args) {
PenFactory pf = new PenFactory();
Pen p = pf.produce("pencil");
p.write("你猜我是一只什么筆?");
 
p = pf.produce("ballpen");
p.write("你猜我是一只什么筆?");
 
p = pf.produce("signpen");
p.write("你猜我是一只什么筆?");
 
p = pf.produce("abc");
p.write("你猜我是一只什么筆?");
}
}


簡單工廠方法模式中,工廠根據用戶提供的實體類型來生產相應的產品,如果用戶提供的產品類型錯誤,則會導致生產產品失敗。下面我們來對簡單工廠模式進行優化,抽象產品和具體產品類保持不變,優化工廠代碼,結果如下:

/**
* 生產圓珠筆
* @return
*/
public Pen proBallpen(){
return new Ballpen();
}
 
/**
* 生產鉛筆
* @return
*/
public Pen proPencil(){
return new Pencil();
}
 
/**
* 生產簽字筆
* @return
*/
public Pen proSignpen(){
return new Signpen();
}


優化后的工廠類為每一種產品提供了一個生產的方法,用戶需要什么產品就調用對應的方法即可,這樣可以避免用戶提供產品類型錯誤導致的問題。當添加了新品種的筆時,我們給工廠添加一個相應的方法即可。但是,在用戶使用工廠之前,必須先把工廠實例化,這樣顯得有些麻煩。在此我們進一步優化工廠,把生成產品的方法都修飾為靜態的。優化后用戶生成產品的方式如下:

 


public class User {
 
/**
* @param args
*/
public static void main(String[] args) {
Pen p = PenFactory.proPencil();
p.write("我是鉛筆,不是圓珠筆");
}
}


以上三種工廠方法模式,在開發中一般使用的是靜態工廠模式(第三種),它沒有第一種的缺陷,同時它比第二種工廠方法模式使用方便。在產品關系設計中,用戶使用產品只依賴于抽象,而沒有依賴具體,這也是設計模式基本原則之一。

 


這樣創新的模式,值得你的選擇!

蝸牛學院,只為成就更好的你!

還在等什么,趕快關注蝸牛學院官方微信,加入到蝸牛學院的大家庭中來吧!

20181009_153045_341.jpg

版權所有,轉載本站文章請注明出處:蝸牛學院在線課堂, http://www.2453566.live/note/42
上一篇: 資訊:狂風暴雨也阻擋不了他們堅定的學習信念,蝸牛學院迎來27期新朋友啦!
下一篇: 漫談:測試設計方法,知識點總結
提示:登錄后添加有效評論可享受積分哦!
黑马股票推荐4月19日黑马股票推荐一览