1. 程式人生 > >簡單工廠模式(由專門的類來建立例項)

簡單工廠模式(由專門的類來建立例項)

最近入手程傑大牛的《大話設計模式》這本書,這本書深入淺出講述了面向物件的23種設計模式,語言通俗易懂,程式碼短小精煉,理論的概述很少,內容都轉化成了我們耳熟能詳,喜聞樂見的文字,下面讓我舉個例子哈!
比如我們都學過面向物件程式設計,但是你要是說起來面向物件有什麼好處?恐怕很多人都會懵逼,不知道從何說起。眾所周知,四大發明中只有印刷術不是發明而是一種改進,以前的是雕版印刷術(將所有字印在同一個板上)改進成活字印刷術(每個字都是一個印章,需要什麼字就去拿章),大家可以想想改進之前有哪些劣勢?

  1. 不可維護(假如我印好了一版《滕王閣序》,但是我檢查的時候發現,MD,我把“落霞與孤鶩齊飛”中的“齊”印成了“起”,那我這篇文章就廢了,還得重新一個一個字印成一版)
  2. 不可重用(即使我印好了也就是隻能用這一次,用完就扔了)
  3. 不可擴充套件(在1中,假如我少印了一個“齊”,那麼我還是得重新印)
  4. 總而言之,改進之前很不靈活
    由此我們可見,活字印刷術之前的印刷工們每天大量重複無用的勞動,浪費了很多時間,如果我們的程式碼中不考慮面向物件思想,那麼我們就和這些印刷工們一樣了。面向物件就像是活字印刷,一個字一個章,章可以重複利用,章與章之間不會相互影響,需要新字加新章,字錯了就改這一個章。
    作者用這個活字印刷的例子幫我深入瞭解了面向物件思維,不知道有沒有幫助你理解呢?如果你很喜歡作者這種比喻的話,在這裡隆重推薦這本書哦。

本節課我們要學習的是簡單工廠模式

假如我們現在遇到這樣一個專案需求:

A公司有兩條產品線,一個是生產隨身聽,一個是生產電視,B公司是採購公司,不懂A公司的產品具體怎麼生產,讓你根據這一點實現B公司採購的程式碼

如果不用工廠模式,我們會想,不就是定義一個隨身聽類,一個電視類嗎,然後定義一個採購類,採購隨身聽或者電視類?這個思路是錯的,因為你在採購類採購隨身聽或者電視類就相當於知道了mp3和tv是如何製造的(你呼叫了他們的構造方法)這和題目要求不符。

???該怎麼做呢?

現在是兩條產品線,以後會不會增加更多呢?考慮到可擴充套件性,我們需要定義一個產品線類(Product),包括隨身聽類(MP3)和電視類(TV),以後也許會有空調類,冰箱類等等,A還需要有一個工廠類,因為B不知道我怎麼生產的,我得根據B的需求提供相應的產品(也就是從A工廠拿貨物)Factory類,對於B來說,B只負責採購,需要一個採購的類,下面我們看程式碼:

 程式碼1 產品
 public interface Product {
     void play();//具備播放功能
}
public class MP3 implements Product {
    @Override
    public void play() {
        System.out.print("mp3播放音樂!");
    }
}
public class TV implements Product {
    @Override
    public void play() {
        System.out.print("TV播放電視劇!");
    }
}
採購工廠,B只需要提出需求,A工廠來負責生產對應的產品
public class Factory {
    public static  Product getProduct(String s){
        switch (s){
            case "TV":
                TV tv = new TV();
                return tv;
            case "mp3":
                MP3 mp3 = new MP3();
                return mp3;
            default:
                return null;
        }
    }
}
B提出了需求要生產TV,工廠就去生產TV
public class Main {
    public static void main(String args[])
    {
        TV tv = (TV) Factory.getProduct("TV");
    }
}

簡單工廠模式的核心思想就是:有一個專門的類來負責建立例項的過程
具體來說,把產品看著是一系列的類的集合,這些類是由某個抽象類或者介面派生出來的一個物件樹。而工廠類用來產生一個合適的物件來滿足客戶的要求。
我們日常工作中最經常用的簡單工廠模式就是JDBC使用
這裡寫圖片描述