成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

設(shè)計模式之工廠模式

huangjinnan / 3462人閱讀

摘要:缺點需要慎重考慮是否增加工廠類進行管理,因為會增加代碼的復(fù)雜度使用場景工廠模式是創(chuàng)建型模式的一種,其實就等價于對象,但是否將對象改造成工廠模式,使我們需要衡量的。

前言

最近北京天氣越來越冷了,同在北京的小伙伴大家注意保暖。不扯廢話了,讓我們直接進入到工廠模式的學(xué)習(xí).

什么是工廠模式
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到子類。
UML類圖 (lol版)

工廠模式的優(yōu)缺點

優(yōu)點:良好的封裝性,代碼結(jié)構(gòu)清晰,擴展性非常強。屏蔽產(chǎn)品類,產(chǎn)品的實際創(chuàng)建在工廠類中,產(chǎn)品類的實現(xiàn)如何變化,調(diào)用者都不需要關(guān)心,只要關(guān)心產(chǎn)品的接口即可。

缺點:需要慎重考慮是否增加工廠類進行管理,因為會增加代碼的復(fù)雜度

使用場景

工廠模式是創(chuàng)建型模式的一種,其實就等價于new對象,但是否將new對象改造成工廠模式,使我們需要衡量的。工廠模式是一個非常靈活的框架設(shè)計,比如我們使用的jdbc,數(shù)據(jù)庫分為oracle和mysql,這些都是產(chǎn)品類,若我們新增一種數(shù)據(jù)庫,只需要增加其產(chǎn)品類就行,符合開閉原則。

代碼分析
//所有英雄的父類
public abstract class Hero {

    public void fromGame() {
        System.out.println("i am come from lol");
    }
    //英雄類型
    abstract void typeOf();
    //英雄特點
    abstract void feature();
}
public class Mage extends Hero {
    @Override
    void typeOf() {
        System.out.println("我是法師");
    }

    @Override
    void feature() {
        System.out.println("我的法術(shù)傷害很爆炸");
    }
}
public class Tank extends Hero {
    @Override
    void typeOf() {
        System.out.println("我是坦克");
    }

    @Override
    void feature() {
        System.out.println("我很肉,我抗性很高");
    }
}
public class Assassin extends Hero {
    @Override
    void typeOf() {
        System.out.println("我是刺客");
    }

    @Override
    void feature() {
        System.out.println("我瞬間傷害很爆炸");
    }
}

就先定義三種類型英雄,其他省略,畢竟我們是學(xué)設(shè)計模式不是打游戲的....

//抽象工廠,定義創(chuàng)建英雄方法
public abstract class AbstractFactory {

    abstract T createHero(Class clazz) throws ClassNotFoundException, IllegalAccessException, InstantiationException;
}
//工廠真正的實現(xiàn)類
public class Factory extends AbstractFactory {
    @Override
     T createHero(Class clazz) {
        Hero hero = null;
        try {
            hero = (Hero) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("class文件有問題");
        }
        return (T) hero;
    }
}
//測試類
public class Client {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        AbstractFactory factory = new Factory();
        Hero hero = factory.createHero(Mage.class);
        Hero hero2 = factory.createHero(Assassin.class);
        Hero hero3 = factory.createHero(Tank.class);

        hero.fromGame();hero.typeOf();hero.feature();
        hero2.fromGame();hero2.typeOf();hero2.feature();
        hero3.fromGame();hero3.typeOf();hero3.feature();
    }
}
測試結(jié)果:
i am come from lol
我是法師
我的法術(shù)傷害很爆炸
i am come from lol
我是刺客
我瞬間傷害很爆炸
i am come from lol
我是坦克
我很肉,我抗性很高

這就是最常見的工廠模式,一定會有小伙伴說你少定義了adc和support。我們現(xiàn)在來思考一下,在這個基礎(chǔ)框架上如何將adc和support加進去。其實我們只需要定義adc和support類,讓其繼承于hero,工廠類什么都不用改,測試類或高層模塊就可以直接使用,是不是很流弊....

工廠模式的擴展

簡單工廠模式

假如一個模塊僅需要一個工廠類,基于這樣的業(yè)務(wù),我們根本沒必要在測試類或高層模塊中將工廠類給生產(chǎn)出來,使用其靜態(tài)方法就好了。應(yīng)該去除抽象工廠類,修改工廠實現(xiàn)類為靜態(tài)方法即可.代碼示例:

public class Factory  {
     static   T createHero(Class clazz) {
        Hero hero = null;
        try {
            hero = (Hero) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            System.out.println("class文件有問題");
        }
        return (T) hero;
    }
}
public class Client {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        Hero hero = Factory.createHero(Mage.class);
        Hero hero2 = Factory.createHero(Assassin.class);
        Hero hero3 = Factory.createHero(Tank.class);

        hero.fromGame();hero.typeOf();hero.feature();
        hero2.fromGame();hero2.typeOf();hero2.feature();
        hero3.fromGame();hero3.typeOf();hero3.feature();
    }
}

運行結(jié)果不會有任何變化,我們的uml類圖也會變得簡單,調(diào)用者也就是測試類或者項目中的高層模塊調(diào)用起來也會簡單,其缺點就是工廠類擴展比較麻煩,不符合開閉原則。

多個工廠類

原來的工廠負責(zé)所有類型英雄的創(chuàng)建,職責(zé)有點太多了。多個工廠類顧名思義就是對工廠類進行拆分,使其符合單一職責(zé)原則。當(dāng)我們遇到一個非常復(fù)雜的項目時,產(chǎn)品類會有很多,并且在我們獲得一個產(chǎn)品類很可能都需要對其初始化,不同的產(chǎn)品類會有不同的實現(xiàn),假如都寫在一個工廠類里,會出現(xiàn)很長很長的if/else或者swtich之類得判斷語句,這種代碼是有毒的!假如你的代碼中有類似代碼,就應(yīng)該考慮下能不能給重構(gòu)了.
UML圖:

public abstract class AbstractFactory {

    abstract Hero createHero();
}
public class AssassianFactory extends AbstractFactory {

    @Override
    Hero createHero() {
        return new Assassin();
    }
}
public class TankFactory extends AbstractFactory {

    @Override
    Hero createHero() {
        return new Tank();
    }
}
public class MageFactory extends AbstractFactory {

    @Override
    Hero createHero() {
        return new Mage();
    }
}
public class Client {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        Hero mageHero = new MageFactory().createHero();
        Hero tankHero = new TankFactory().createHero();
        Hero assassinHero = new AssassianFactory().createHero();
    }
}

每一個產(chǎn)品類都對應(yīng)了一個工廠,好處就是職責(zé)清晰,結(jié)構(gòu)簡單。壞處就是我們擴展新的產(chǎn)品時,需要額外擴展一個工廠類,增加了擴展的難度

延遲初始化

一個對象被消費完畢后,并不立即釋放,工廠類保持其初始化,等待再次被使用.
public class HeroFactory {
    private static final Map heroMap = new HashMap<>();

    public static synchronized Hero createHero(String type) {
        Hero hero = null;
        if (heroMap.containsKey(type)) {
            return heroMap.get(type);
        } else {
            if (type.equals("mage")) {
                hero = new Mage();
            } else if (type.equals("tank")) {
                hero = new Tank();
            } else {
                hero = new Assassin();
            }
            heroMap.put(type, hero);
        }
        return hero;
    }

}

我們定義了一個靜態(tài)常量heroMap,在內(nèi)存中對工廠創(chuàng)建的對象進行延遲化,方便下次調(diào)用。同時也非常方便擴展,比如我們在玩英雄聯(lián)盟,知道雙方英雄不會超過10個,可以根據(jù)map的長度,判斷內(nèi)存中最多的hero實例數(shù)。

總結(jié)

工廠模式是一個很常見很優(yōu)秀的設(shè)計模式,我們應(yīng)該多思考工廠方法如何應(yīng)用,而且工廠模式和原型模式單例模式結(jié)合起來會用更多神奇的設(shè)計!不用著急,我們慢慢來...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70630.html

相關(guān)文章

  • PHP面試???em>之設(shè)計模式——工廠模式

    摘要:工廠模式其實可以劃分為簡單工廠模式工廠方法模式抽象工廠模式等。簡單工廠模式介紹簡單工廠模式又稱為靜態(tài)工廠方法模式,它屬于類創(chuàng)建型模式。此模式是對工廠方法模式的進一步擴展。 你好,是我琉憶,PHP程序員面試筆試系列圖書的作者。 本周(2019.3.11至3.15)的一三五更新的文章如下: 周一:PHP面試??贾O(shè)計模式——工廠模式周三:PHP面試??贾O(shè)計模式——建造者模式周五:PHP...

    Jiavan 評論0 收藏0
  • Spring框架我見(一)——工廠模式

    摘要:相對于工廠模式,抽象工廠模式生產(chǎn)的對象更加具體,也更加豐富,但相對編碼也更加復(fù)雜。具體的抽象工廠模式的實現(xiàn)大家可以參考菜鳥教程。知道了工廠模式和抽象工廠模式的區(qū)別,請大家使用的時候應(yīng)該根據(jù)具體的情況進行選擇。 大家好,今天給大家分享一些Spring的學(xué)習(xí)心得,在講Spring之前,先和大家分享Spring中核心的設(shè)計模式。 工廠模式 在聊概念之前我先問問大家:什么是工廠? 這個很簡單,...

    venmos 評論0 收藏0
  • 優(yōu)才公開課筆記:php設(shè)計模式 (二)工廠模式

    摘要:但本質(zhì)是,簡單工廠并未嚴格遵循設(shè)計模式的開閉原則,當(dāng)需要增加新產(chǎn)品時也需要修改工廠代碼。但是工廠方法則嚴格遵守開閉原則,模式只負責(zé)抽象工廠接口,具體工廠交給客戶去擴展。 最近開展了三次設(shè)計模式的公開課,現(xiàn)在來總結(jié)一下設(shè)計模式在PHP中的應(yīng)用,這是第二篇創(chuàng)建型模式之工廠模式。 設(shè)計模式的一般介紹在第一篇文章講了,這里就不重復(fù)。 工廠模式 實現(xiàn):定義一個用于創(chuàng)建對象的接口,讓子類決定實...

    aisuhua 評論0 收藏0
  • 設(shè)計模式系列工廠模式

    摘要:設(shè)計模式之工廠模式工廠模式包括了簡單工廠工廠方法和抽象工廠。工廠方法模式下面我們針對普通工廠模式的缺點進行優(yōu)化。 設(shè)計模式之工廠模式 工廠模式包括了簡單工廠、工廠方法和抽象工廠。下面我從java實際應(yīng)用的角度分別介紹這三種模式。 簡單工廠模式 下面看下JDBC中獲取Connection的代碼 public class ConnectionFactory { public Con...

    MrZONT 評論0 收藏0
  • 一天一個設(shè)計模式JS實現(xiàn)——工廠模式

    摘要:參考文章深入理解三種工廠模式工廠模式,工廠方法模式,抽象工廠模式詳解工廠模式是中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 參考文章:深入理解java三種工廠模式工廠模式,工廠方法模式,抽象工廠模式 詳解 工廠模式(Factory Pattern)是 Java 中最常用的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的...

    Muninn 評論0 收藏0
  • 工廠模式(一)抽象工廠模式

    摘要:主要詳解簡單工廠模式到抽象工廠模式的演變。抽象工廠模式當(dāng)一個類別的產(chǎn)品還有多個系列區(qū)分時,為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。 主要詳解簡單工廠模式到抽象工廠模式的演變。 簡單工廠模式 即靜態(tài)工廠模式1.將對象的創(chuàng)建和使用分開;2.將生產(chǎn)過程集中,便于集中管理;3.當(dāng)需要創(chuàng)建的對象類有變動時,就不用在所有new 的地方修改了,直接修改工廠類即可; /** * 簡單工廠模式 ---...

    woshicixide 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<