今天看了一篇關於工廠模型的博文。感覺不錯,可謂感觸頗深,對工廠模型的理解有進一步。下面我也簡單介紹一下工廠模型。
工廠模型主要分爲以下三種狀態:
(1).簡單工廠模型(SimpleFactory)
(2)工廠方法(Factory Method)
(3)抽象工廠(Abstract Factory)
1.簡單工廠模型:其實就是定義一個接口,不同的產品類實現這個接口,最後工廠類通過傳入的不同參數去生產不同的產品。這裏的核心就是工廠類。下面介紹一個小例子。
假設我們要生產手機和電腦該怎麼辦呢?
首先先定義一個產品Product接口
public interface Product { }
要生產手機和電腦就得分別定義電腦類和手機類。
電腦類:
public class Computer implements Product{ public Computer(){ System.out.println("電腦被製造出來了"); } }
手機類:
public class Phone implements Product{ public Phone(){ System.out.println("電話被製造出來了"); } }
這個時候呢就需要工廠出面了。根據傳入的參數不同,就代表了不同的需求,生產不同的產品。
簡單工廠類:
public class SimpleFactory { public static Product Factory(String productName)throws Exception{ if("phone".equals(productName)){ return new Phone(); }else if("computer".equals(productName)){ return new Computer(); }else{ throw new Exception("沒有改產品"); } } }
下面我們寫個測試類,看一下運行結果:
測試類:
public class TestSimpleFactory { public static void main(String[] args) { try{ SimpleFactory.Factory("computer"); SimpleFactory.Factory("phone"); }catch(Exception e){ e.printStackTrace(); } } }
測試結果爲:
電腦被製造出來了
電話被製造出來了
這就是簡單工廠,但是簡單工廠尤其侷限性。簡單工廠的核心就是工廠類。一旦工廠類失效,則整個程序就會失效。所以就有了工廠方法和抽象工廠。下面先介紹一下工廠方法。
2工廠方法:簡單的說工廠方法就是給工廠定義了接口,通過多態的形式削弱了工廠的作用。
工廠的接口:定義了一個抽象方法。
public interface Factory { public Product create(); }
和上面一樣也定義了一個產品接口:用於實現不同產品的生產。
產品接口:
public interface Product { }
既然有了產品接口就生產不同的產品吧。
手機類:
public class Phone implements Product{ public Phone(){ System.out.println("電話被製造出來了"); } }
電腦類:
public class Computer implements Product{ public Computer(){ System.out.println("電腦被製造出來了"); } }
工廠方法的最主要特點就是定義了工廠接口,可以定義出專門生產電腦的工廠,也可以定義出專門生產手機的工廠等等。。。下面就定義工廠的實現類吧
電腦工廠類:專門生產電腦
public class ComputerFactory implements Factory { public Product create() { return new Computer(); } }
手機工廠類:專門生產手機
public class PhoneFactory implements Factory{ public Product create() { return new Phone(); } }
下面我們寫一下工廠方法類:主要創建不同的工廠類,通過不同的工廠生產不同的產品。
工廠方法類:
public class FactoryMethod { public static void main(String[] args) { ComputerFactory cf = new ComputerFactory(); cf.create(); PhoneFactory pf = new PhoneFactory(); pf.create(); } }
下面看一下運行結果:
電腦被製造出來了
電話被製造出來了
接下來介紹一下抽象工廠類。之後在總結一下三者的區別。
3抽象工廠類:就是現在的產品更加豐富,就像聯想電腦還有不同的型號,而不是單一的一種型號。這是對產品的接口就得更加細化。例如手機和電腦不在簡單的定義一個產品接口就可以,而是的對其分別定義不同的接口:下面我們就對其定義接口如下:
手機接口:
public interface Phone { }
電腦接口:
public interface Computer { }
有了接口我們就可以通過接口實現不同的產品類了:
手機產品類:
(1)聯想手機類:
public class LenovoPhone implements Phone{ public LenovoPhone(){ System.out.println("聯想手機被生產出來了"); } }
(2)蘋果手機類:
public class ApplePhone implements Phone{ public ApplePhone(){ System.out.println("蘋果手機被生產出來了"); } }
電腦產品類:
(1)聯想電腦類:
public class LenovoComputer implements Computer{ public LenovoComputer(){ System.out.println("聯想電腦被生產出來了"); } }
(2)蘋果電腦類:
public class AppleComputer implements Computer{ public AppleComputer(){ System.out.println("蘋果電腦被生產出來了"); } }
對了我們還需要創建一個工廠類接口:這個接口與前面的有所不同。請看
public interface Factory { public Computer createComputer(); public Phone createPhone(); }
這個工廠接口不僅有電腦抽象方法還有手機的抽象方法。就像聯想工廠的創建不僅僅是爲了生產電腦,而是爲了能生產聯想的各種電子產品。下面定義聯想工廠實現類:
聯想工廠實現類:
public class LenovoFactory implements Factory{ public Phone createPhone() { return new LenovoPhone(); } public Computer createComputer() { return new LenovoComputer(); } }
蘋果工廠的實現類:
public class AppleFactory implements Factory{ public Computer createComputer() { return new AppleComputer(); } public Phone createPhone() { return new ApplePhone(); } }
下面寫個測類,看下結果。
測試類:定義不同的工廠對象,進行產品生產。
public class TestAbstractFactory { public static void main(String[] args) { LenovoFactory lf = new LenovoFactory(); lf.createComputer(); lf.createPhone(); AppleFactory af = new AppleFactory(); af.createComputer(); af.createPhone(); }
運行結果:
聯想電腦被生產出來了
聯想手機被生產出來了
蘋果電腦被生產出來了
蘋果手機被生產出來了
三種工廠方法已經介紹了,現在總結一下三個方法的區:
簡單工廠模型就是這個工廠什麼都能生產,工廠的作用比較大,一旦工廠出現問題則所有的產品都不能生產,在這裏工廠是當之無愧的核心所在。而工廠方法呢,則削弱了工廠的核心作用。給工廠定義了接口,可以實現不同工廠類,一旦那個工廠出現問題其他工廠照樣可以生產產品。但是唯一的不足是一個工廠只能生產單一的產品。而抽象工廠類實現一個工廠生產不同的產品。抽象工廠類和工廠方法各有各的特點,各有所長,使用與不同的生產模式。