????此文將工廠模式和抽象工廠模式整理在一起,因靜態(tài)工廠模式涉及到"是否應該代替構造器"等很多其他的問題,故本文將靜態(tài)工廠模式單獨拿出,以后另起一篇詳細講解.
工廠模式按模式類型分為三種:
1. 簡單工廠模式
2. 工廠方法模式
3. 抽象工廠模式
1.簡單工廠模式:創(chuàng)建一個工廠類气筋,對實現(xiàn)了同一接口的一些類進行實例的創(chuàng)建.
有些說法認為簡單工廠模式僅僅只是用來創(chuàng)建對象的一個類,并不算23種設計模式之一.
請看下例:
創(chuàng)建一個共同的接口
public interface Phone {//工廠方法產生的對象,返回值全部由此接口接收
public void call();
}
其次,創(chuàng)建實現(xiàn)類:
public class Ipone/* 生產蘋果手機的工廠 */ implements Phone {
{// 我們只關心工廠是否創(chuàng)建對象,所以通過代碼塊來測試,下文不使用對象具體的功能(方法)
System.out.println("make a Ipone!");// 生產一個蘋果手機
}
@Override
public void call() {
System.out.println("用蘋果打電話");
}
}
public class Huawei/* 生產華為手機的工廠 */ implements Phone {
{
System.out.println("make a Huawei!");// 生產了一個華為手機
}
@Override
public void call() {
System.out.println("用華為打電話");
}
}
最后,建工廠類:
public class PhoneFactory_Simple {
public Phone producePhone(String phoneType/* 手機類型 */) {
if ("Ipone".equals(phoneType)) {
return new Ipone();
} else if ("Huawei".equals(phoneType)) {
return new Huawei();
} else {
System.out.println("請輸入正確的類型!");
return null;
}
}
}
我們來測試下:
public class Test01 {
public static void main(String[] args) throws Exception {
PhoneFactory_Simple factor = new PhoneFactory_Simple();
Phone Huawei = factor.producePhone("Huawei");
Phone Ipone = factor.producePhone("Ipone");
factor.producePhone("Xiaomi");
}
}
結果:
make a Huawei!
make a Ipone!
請輸入正確的類型!
2.工廠方法模式:是對簡單工廠模式的功能的增強與解耦池磁,在簡單工廠模式中,如果傳遞的字符串出錯,則不能正確創(chuàng)建對象兽肤,而工廠方法模式是直接提供多個工廠方法套腹,直接調用方法創(chuàng)建對象,不需傳遞參數(shù),而且產品的種類沒有限制.
下面我們新建一個電腦接口:
public interface Computer {
public void play();
}
創(chuàng)建一個Lenova實現(xiàn)類
public class Lenova implements Computer {
{
System.out.println("make a Lenova!");
}
@Override
public void play() {
System.out.println("用聯(lián)想玩游戲!");
}
}
那么改寫之后的工廠類代碼如下:
public class Factory {
public static Phone produceIpone()/* 生產蘋果 */ {
return new Ipone();
}
public static Phone produceHuawei()/* 生產華為 */ {
return new Huawei();
}
public static Computer produceLenova()/* 生產聯(lián)想 */ {
return new Lenova();
}
}
測試代碼如下:
public class Test02 {
public static void main(String[] args) throws Exception {
Factory factory = new Factory();
Phone huawei = factory.produceHuawei();
Phone ipone = factory.produceIpone();
Computer lenova = factory.produceLenova();
}
}
結果:
make a Huawei!
make a Ipone!
make a Lenova!
3.抽象工廠模式(Abstract Factory)
工廠方法模式有一個問題,類的創(chuàng)建依賴工廠類资铡,如果想要拓展程序电禀,必須對工廠類進行修改,這就違背了開閉原則(Open Closed Principle)笤休,從設計角度考慮尖飞,為解決此問題就需要用到抽象工廠模式,將工廠也抽象化店雅,這樣一旦需要增加新的功能政基,直接增加新的工廠類實現(xiàn)抽象工廠接口就可以了,不需要修改之前的代碼,在工廠方法模式的基礎上進一步增強了功能和解耦.
請看下例:
提供一個生產手機和一個生產電腦的接口,將工廠抽象化,需要生產商品的時候實例化相應接口建造一個工廠即可
public interface PhoneFactor {
public Phone producePhone();
}
public interface ComputerFactor {
public Computer produceComputer();
}
想生產什么類型的東西,只需要實現(xiàn)對應的工廠接口即可
下面我們創(chuàng)建一個生產Mac的工廠和一個生產小米的工廠,為避免文章冗余,Mac和小米的具體類就不寫了
生產Mac的工廠
public class HuaweiFactor implements PhoneFactor {
@Override
public Phone produce() {
return new Huawei();
}
}
生產小米的工廠
public class MacFactor implements ComputerFactor {
@Override
public Computer produceComputer() {
return new Mac();
}
}
測試代碼:
public class Test03 {
public static void main(String[] args) throws Exception {
XiaoMiFactor xiaoMiFactor = new XiaoMiFactor();
Phone phone = xiaoMiFactor.producePhone();
MacFactor macFactor = new MacFactor();
Computer computer = macFactor.produceComputer();
}
}
結果:
make a XiaoMi !
make a Mac!
總結
工廠模式適合在需要大量創(chuàng)建對象的時候使用,從簡單工廠模式到工廠方法模式,再到抽象工廠模式是一個功能擴展和解耦的過程,下面舉例說明:
1.簡單工廠模式:小作坊,只能生產某一類產品(實現(xiàn)了同一接口)且種類有限,還得你提供材料(傳入?yún)?shù)),功能有限.
2. 工廠方法模式:已經升級為大工廠,想造什么直接來選(直接調用空參方法,可根據(jù)方法名來辨識),在簡單工廠模式的基礎上功能已經有所擴展,但是工廠類還是固定的,想要生產其他產品就必須改造此工廠(繼承此工廠類增加新方法),產品與工廠之間的耦合性還是太高.
3. 抽象工廠模式:工廠是抽象的,我已經不是clearlove了,你想造什么告訴我,我先根據(jù)需求造一個工廠出來(實現(xiàn)對應的工廠接口),不用改造已存在工廠(改代碼),擴展性強,耦合性低.