設計模式:簡單工廠模式


設計模式:簡單工廠模式

1. 基本概念

1.1 原理

簡單工廠模式是一種創建型模式,即它主要的作用是用於創建某些類的實例。簡單工廠模式的主要內容是定義一個工廠類和多個產品類,工廠類包含一個用戶可以調用的工廠方法。該工廠方法根據用戶傳遞給它的不同參數而創建不同產品類的實例並返回給用戶。

通過引入簡單工廠模式,用戶將不再關心它所需要的產品類實例是如何被創建的,因為這一部分職責已經被委託給了工廠類的工廠方法;用戶現在要做的只是按照它的業務邏輯使用該產品類實例。

因為工廠方法可以返回多種產品類的實例,而用戶要能夠按照統一的方式使用它們,那麼這些產品類應該具有一個共同的父類。該父類定義了這些產品類共同的接口,而具體的產品類對這些接口進行不同的實現。

此外,在一些嚴格類型的編程語言(比如C++、Java)中,一個函數或者一個方法只能返回一種類型;這也決定了所有的產品類應該具有一個公共的父類。

為了方便,我們通常將工廠方法定義為工廠類的靜態方法,這樣我們無需實例化該工廠類就可以直接在它之上調用它的工廠方法。因此,簡單工廠模式也被稱為靜態工廠方法(Static Factory Method)模式。

在設計模式領域最著名的著作《設計模式:可複用面向對象軟件的基礎》中,並沒有收錄簡單工廠模式,而且有些人認為嚴格來說簡單工廠甚至不能算是一種設計模式。但是理解簡單工廠對於理解工廠方法模式和抽象工廠模式有很大的幫助,所以這裡我們依舊將它當作一種設計模式來進行講解。

1.2 結構


設計模式:簡單工廠模式

圖1 簡單工廠模式的類圖結構

簡單工廠模式的類圖如圖1所示,這些類在簡單工廠模式中扮演下面這些角色:

Client:用戶代碼,它調用工廠類的工廠方法並使用返回的具體產品類的實例。

Factory:工廠類,它有一個工廠方法;它根據用戶傳遞的不同參數而創建並返回某一具體產品類的實例。

Product:所有產品類的公共父類,它定義所有產品類的接口以供用戶調用。

ConcreteProduct:具體的產品類,繼承自Product,實現Product定義的接口;它的實例由工廠方法創建。

2. 示例

筆記本電腦、智能手機和平板電腦都屬於計算機設備,用戶可以用任意一種計算機設備來工作、聊天和觀看電影。我們使用簡單工廠模式以及Java編程語言來實現這一示例,為此我們還要定義一個工廠類,由它根據用戶的要求來生產實際的計算機產品。

2.1 定義產品類

2.1.1 所有產品類的公共父類

<code>/*
* 所有產品類的公共父類,它定義3個接口:work()、chat()和watchMovie()
*/
public abstract class Computer {
public abstract void work();
public abstract void chat();
public abstract void watchMovie();
};/<code>

2.1.2 筆記本電腦類Laptop

<code>/*
* 具體的產品類Laptop,它繼承自Computer
*/
public class Laptop extends Computer {
@Override
public void work() {
System.out.println("Work by Laptop.");
}

@Override
public void chat() {
System.out.println("Chat by Laptop.");
}

@Override
public void watchMovie() {
System.out.println("Watch movie by Laptop.");
}
}/<code>

2.1.3 智能手機類SmartPhone

<code>/*
* 具體的產品類SmartPhone,它繼承自Computer
*/
public class SmartPhone extends Computer {
@Override
public void work() {
System.out.println("Work by SmartPhone.");
}

@Override
public void chat() {

System.out.println("Chat by SmartPhone.");
}

@Override
public void watchMovie() {
System.out.println("Watch movie by SmartPhone.");
}
}/<code>

2.1.4 平板電腦類Tablet

<code>/*
* 具體的產品類Tablet,它繼承自Computer
*/
public class Tablet extends Computer {
@Override
public void work() {
System.out.println("Work by Tablet.");
}

@Override
public void chat() {
System.out.println("Chat by Tablet.");
}

@Override
public void watchMovie() {
System.out.println("Watch movie by Tablet.");
}
}/<code>

2.2 定義工廠類

<code>/*
* 簡單工廠類,提供工廠方法createComputer
*/
public class SimpleFactory {
/*
* 工廠方法,根據參數的不同而創建不同的計算機產品;
* 如果參數錯誤則拋出異常。
*/
public static Computer createComputer(String type) {
Computer computer = null;
switch(type) {

case "laptop":
computer = new Laptop();
break;

case "smartPhone":
computer = new SmartPhone();
break;

case "tablet":
computer = new Tablet();
break;

default:
throw new IllegalArgumentException("type參數錯誤。");
}

return computer;
}
}/<code>

2.3 定義用戶代碼

<code>/*
* 用戶代碼,它用不同的參數調用工廠方法;
* 並使用返回的具體產品類的實例。
*/
public class Client {
public static void main(String[] args) {
/*
* 請求工廠類生產一個筆記本電腦(laptop)
*/
Computer computer = SimpleFactory.createComputer("laptop");
computer.work();
computer.chat();
computer.watchMovie();

/*
* 請求工廠類生產一個平板電腦(tablet)
*/
computer = SimpleFactory.createComputer("tablet");
computer.work();
computer.chat();
computer.watchMovie();

}
}/<code>

3. 優缺點和使用場景

簡單工廠的優點就是它分離了產品類實例的創建和使用,在一定程度上實現了代碼的解耦。用戶代碼只關心如何使用產品而不關心產品是如何被創建的,當需要修改產品的創建邏輯的時候可以只修改工廠類而不需要修改用戶代碼。

簡單工廠模式的缺點就是產品類的創建邏輯全都集中在工廠類中,每當增加產品類時都要修改工廠類,即要修改已存在的代碼,這違背了開閉原則。而且當產品類很多的時候,工廠類中的創建邏輯將變得非常複雜,當邏輯變得越來越複雜的時候就越容易出錯。

綜上所述,簡單工廠模式適用於用戶不關心產品類如何被創建而只關心使用產品類,產品類數量較小且穩定的情況下。

(完)


分享到:


相關文章: