今天有幸拜讀了以下大鳥的《大話設計模式》,刷新了我的編程三觀,發現如果寫代碼只爲了實現功能,那也太low了,編程就是一門藝術。
工廠模式是一個最簡單的模式,它的主要功能是根據需要創建合適的對象。
例如:有一天我口渴了想吃水果,到了水果店,跟裏面的店員說:”我想吃蘋果。“ 店員就拿出來一個蘋果給我。這個水果店就像一個工廠,我想要什麼,店員就拿給我什麼。
工廠模式的UML類圖如下,以上面的吃水果的例子爲例:
Fruit是一個抽象類,有一個屬性name,還有一個公有方法eat。下面的Apple、Orange、Peach類繼承Fruit類。FruitStore類是一個工廠,與Fruit類是關聯關係(水果店需要知道水果的存在),在這個類中,還有一個getFruit方法,返回一個Fruit對象。
工廠模式可以把面向對象的三大特性:封裝、繼承、多態 體現地淋淋盡致了。把水果的共性(有名稱,可以吃)抽象出來進行封裝 做成父類,具體水果繼承 父類具體實現,最後水果店類返回給用戶一個水果對象,當用戶吃水果的時候,就可以具體地吃到某一種水果了,這就是多態。
該模式用Java語言實現如下(還是上面水果店的例子):
import java.util.*;
abstract class Fruit
{
public String name;
public abstract void eat();
}
class Apple extends Fruit
{
public Apple()
{
this.name = "蘋果";
}
public void eat()
{
System.out.println("吃蘋果...");
}
}
class Orange extends Fruit
{
public Orange()
{
this.name = "橘子";
}
public void eat()
{
System.out.println("吃橘子...");
}
}
class Peach extends Fruit
{
public Peach()
{
this.name = "桃子";
}
public void eat()
{
System.out.println("吃桃子...");
}
}
class FruitStore
{
public static Fruit getFruit(String type)
{
switch(type)
{
case "Apple": return new Apple();
case "Orange": return new Orange();
case "Peach": return new Peach();
default: return null;
}
}
}
public class Main
{
public static void main(String args[])
{
Fruit f = FruitStore.getFruit("Apple");
f.eat();
}
}
運行結果如下: