簡單工廠模式

概念

簡單工廠模式是類的創(chuàng)建模式,又叫靜態(tài)工廠方法(Static Factory Method)模式。簡單工廠模式是由一個(gè)工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例 -摘自《Java與模式》

簡單工廠模式包含三個(gè)角色

  1. Factory : 工廠角色,是簡單工廠模式下的核心,工廠類會(huì)提供一個(gè)供客戶端調(diào)用Static靜態(tài)方法,根據(jù)客戶端傳遞的參數(shù)的不同,創(chuàng)建不同的實(shí)例對象。
  2. AbstractProduct : 抽象產(chǎn)品角色,工廠類創(chuàng)建對象的父類,Java語言面向?qū)ο蟮脑O(shè)計(jì)思想,會(huì)盡量將公共的屬性,抽成一個(gè)公共的父類,讓子類進(jìn)行繼承。
  3. ConcreteeProduct : 具體產(chǎn)品類,由工廠類的靜態(tài)方法創(chuàng)建對象的實(shí)例對象

案例

工廠類

package com.schoki.design.model.factory;

/**
 * @author : zhubing.ji
 * @description : 工廠類
 * @date : 2018/7/5 上午9:53
 */
public class FruitProductFactory {

    public static FruitJuiceProduct getInstance(String taste) {
        FruitJuiceProduct fruitJuiceProduct;
        switch (taste) {
            case "apple":
                fruitJuiceProduct = new AppliJuiceProduct();
                break;
            case "orange":
                fruitJuiceProduct = new OrangeJuiceProduct();
                break;
            case "banana":
                fruitJuiceProduct = new BananaJuiceProduct();
                break;
            default:
                throw new IllegalArgumentException("參數(shù)異常");
        }
        return fruitJuiceProduct;
    }
}

抽象產(chǎn)品類

、package com.schoki.design.model.factory;

/**
 * @author : zhubing.ji
 * @description : 抽象產(chǎn)品類
 * @date : 2018/7/5 上午9:46
 */
public abstract class FruitJuiceProduct {

    private String taste;

    public abstract String getTaste();
}

具體產(chǎn)品類

package com.schoki.design.model.factory;

/**
 * @author : zhubing.ji
 * @description : 具體產(chǎn)品類
 * @date : 2018/7/5 上午9:48
 */
public class AppliJuiceProduct extends FruitJuiceProduct{

    @Override
    public String getTaste() {
        return "蘋果味";
    }
}

測試

package com.schoki.design.model.factory;

/**
 * @author : zhubing.ji
 * @description : 測試類
 * @date : 2018/7/5 上午9:56
 */
public class FruitMain {


    public static void main(String[] args) {
        FruitJuiceProduct fruit1 = FruitProductFactory.getInstance("apple");
        System.out.println(fruit1.getTaste());

        FruitJuiceProduct fruit2 = FruitProductFactory.getInstance("banana");
        System.out.println(fruit2.getTaste());

        FruitJuiceProduct fruit3 = FruitProductFactory.getInstance("orange");
        System.out.println(fruit3.getTaste());

        FruitJuiceProduct fruit4 = FruitProductFactory.getInstance("mango");
        System.out.println(fruit4.getTaste());

    }
}

測試結(jié)果

蘋果味
香蕉味
橘子味
Exception in thread "main" java.lang.IllegalArgumentException: 參數(shù)異常
    at com.schoki.design.model.factory.FruitProductFactory.getInstance(FruitProductFactory.java:23)
    at com.schoki.design.model.factory.FruitMain.main(FruitMain.java:21)

總結(jié)

總結(jié)

  1. 對象的創(chuàng)建交給工廠類,業(yè)務(wù)由具體產(chǎn)品類實(shí)現(xiàn),這樣可以實(shí)現(xiàn)對象的創(chuàng)建和業(yè)務(wù)分離,從而降低了系統(tǒng)的耦合度
  2. 可以根據(jù)需要,調(diào)用工廠的靜態(tài)方法,根據(jù)參數(shù)的不同,創(chuàng)建不同的對象
  3. 如果有新的產(chǎn)品類,則還需要修改工廠類,這樣違反了開閉原則(對擴(kuò)展開放,對修改關(guān)閉)
  4. 對于工廠類創(chuàng)建對象相對較少的情況下,可以嘗試使用簡單工廠方法。
  5. JDK中的java.text.DateFormat,就是使用了簡單工廠模式
  public final static DateFormat getDateInstance();
  public final static DateFormat getDateInstance(int style);
  public final static DateFormat getDateInstance(int style,Locale

寫在最后

    1、只有那些瘋狂到認(rèn)為自己可以改變世界的人才能真正的改變世界
    2、每一行代碼,每一篇博客,都體現(xiàn)了自己對工作、對技術(shù)、對生活的態(tài)度

參考
http://www.hollischuang.com/archives/1391
http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html
http://wiki.jikexueyuan.com/project/design-pattern-creation/simple-two.html
http://www.hollischuang.com/archives/1408

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容