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

資訊專欄INFORMATION COLUMN

工廠模式(一)之抽象工廠模式

woshicixide / 2589人閱讀

摘要:主要詳解簡(jiǎn)單工廠模式到抽象工廠模式的演變。抽象工廠模式當(dāng)一個(gè)類別的產(chǎn)品還有多個(gè)系列區(qū)分時(shí),為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。

主要詳解簡(jiǎn)單工廠模式到抽象工廠模式的演變。

簡(jiǎn)單工廠模式

即靜態(tài)工廠模式
1.將對(duì)象的創(chuàng)建和使用分開;
2.將生產(chǎn)過程集中,便于集中管理;
3.當(dāng)需要?jiǎng)?chuàng)建的對(duì)象類有變動(dòng)時(shí),就不用在所有new 的地方修改了,直接修改工廠類即可;

/**
 * 簡(jiǎn)單工廠模式 --- 靜態(tài)工廠模式
 */
public class StaticFactory {
    public static final int TYPE_APPLE = 1;//蘋果
    public static final int TYPE_ORANGE = 2;//桔子
    public static final int TYPE_BANANA = 3;//香蕉

    public static Fruit getFruit(int type){
        if(TYPE_APPLE == type){
            return new Apple();
        } else if(TYPE_ORANGE == type){
           return new Orange("Peter",80);
        } else if(TYPE_BANANA == type){
            return new Banana();
        }
        return null;
    }

    /**
     * 多方法工廠
     * @return
     */
    public static Fruit getFruitApple(){
        return new Apple();
    }

    public static Fruit getFruitOrange(){
        return new Orange("Peter",80);
    }

    public static Fruit getFruitBanana(){
        return new Banana();
    }


}

總的來說,簡(jiǎn)單工廠模式就是用一個(gè)專業(yè)類(工廠類)來負(fù)責(zé)一種產(chǎn)品(水果類)的對(duì)象創(chuàng)建

簡(jiǎn)單工廠模式不屬于23種設(shè)計(jì)模式,是工廠模式的基礎(chǔ).

思考?若工廠生產(chǎn)的產(chǎn)品越來越多,靜態(tài)工廠不斷修改,方法擴(kuò)展極為龐大,產(chǎn)品品種擴(kuò)展不優(yōu)雅.

1.不符合單一職責(zé)原則:一個(gè)類負(fù)責(zé)了各類水果的創(chuàng)建.

2.不符合開閉原則:擴(kuò)展品種時(shí),需要修改已有代碼,修改工廠類.

工廠方法模式

為了解決靜態(tài)工廠的問題,我們采用工廠方法模式

1.將靜態(tài)工廠打散,每一個(gè)水果品類,對(duì)應(yīng)一個(gè)水果品類工廠來生產(chǎn)。

2.當(dāng)需要擴(kuò)展水果品類時(shí),對(duì)應(yīng)擴(kuò)展一個(gè)水果品種的工廠即可。

將工廠類抽象出一個(gè)接口,對(duì)象的創(chuàng)建方法延遲到工廠子類去實(shí)現(xiàn).

/**
 * 工廠方法接口
 */
public interface FruitFactory {
    public Fruit getFruit();//摘水果指令
}

/**
 * 橘子工廠子類
 */
public class OrangeFactory implements FruitFactory{
    public Fruit getFruit(){
        return new Orange("Peter",80);
    }
}


 /**
 * 香蕉工廠子類
 */
public class BananaFactory implements FruitFactory{
    public Fruit getFruit(){
        return new Banana();
    }
}
/**
 * 蘋果工廠子類
 */
public class AppleFactory implements FruitFactory{
    public Fruit getFruit(){
        return new Apple();
    }
}

 /**
 * 水果獲取測(cè)試
 *
 */
public class FruitTest {

    private static FruitFactory fruitFactory;

    public static void main(String[] args) {
        getFruit();
    }

    /**
     * 獲得水果
     */
    public static void getFruit(){
        //初始化蘋果工廠
        fruitFactory = new AppleFactory();
        Fruit fruit = fruitFactory.getFruit();
        fruit.draw();

        //初始化香蕉工廠
        fruitFactory = new BananaFactory ();
        Fruit bananafruit = fruitFactory.getFruit();
        bananafruit.draw();
        //想要獲取什么水果就實(shí)例化哪個(gè)工廠

    }
}


通過工廠方法模式,解決了單一職責(zé)和開閉原則問題。
需要具體的產(chǎn)品則初始化對(duì)應(yīng)的工廠,在spring中經(jīng)常是配置在配置文件中,

//然后注入進(jìn)去,面向接口編程我們注入的是接口實(shí)現(xiàn)類在配置里
@Autowired
private FruitFactory fruitFactory;


為什么使用抽象工廠模式

業(yè)務(wù)慢慢發(fā)展,現(xiàn)在水果店品種增加,那我們按著工廠方法模式新增其他工廠實(shí)現(xiàn)類。

現(xiàn)在除了賣水果的服務(wù)還要提供額外服務(wù),比如要包裝好,同樣的我們就新建一個(gè)包裝工廠接口如下BagFactory負(fù)責(zé)打包。

/**
 * 工廠方法模式
 */
public interface BagFactory {
    public Bag getBag();//打包指令
}
/**
 * 負(fù)責(zé)香蕉的打包
 */
public class BananaBagFactory implements BagFactory{
    public Bag getBag(){
        return new BananaBag();
    }
}
/**
 * 負(fù)責(zé)蘋果的打包
 */
public class AppleBagFactory implements BagFactory{
    public Bag getBag(){
        return new AppleBag();
    }
}


一個(gè)水果店的動(dòng)作,就有從工廠獲取水果,然后從工廠獲取打包服務(wù),如下:

/**
 * 水果店測(cè)試
 * Created by Peter on 10/8 008.
 */
public class FruitStoreTest {

    private static FruitFactory fruitFactory;
    private static BagFactory bagFactory;

    public static void main(String[] args) {
        pack();
    }

    /**
     * 郵寄打包
     */
    public static void pack(){
        //初始化蘋果工廠
        fruitFactory = new AppleFactory();//獵取工廠不對(duì)應(yīng)
        Fruit fruit = fruitFactory.getFruit();
        fruit.draw();

        //初始化蘋果包裝工廠
        bagFactory = new BananaBagFactory();
        Bag bag = bagFactory.getBag();

        bag.pack();

        //....郵寄業(yè)務(wù)
    }   

產(chǎn)品類圖如下:

同樣的,要是再加一個(gè)郵寄業(yè)務(wù),我們也是同樣的新增一個(gè)郵寄工廠。

問題? 在實(shí)際寫代碼的時(shí)候是否會(huì)發(fā)生這種問題: 即獵取工廠不對(duì)應(yīng)

1.初始化蘋果工廠獲取蘋果

2.初始化香蕉工廠來做包裝業(yè)務(wù)

3.初始化別的郵寄工廠來做郵寄服務(wù)

抽象工廠模式

針對(duì)上面的問題就要用到我們的抽象工廠模式了。

抽象工廠模式:當(dāng)一個(gè)類別的產(chǎn)品還有多個(gè)系列區(qū)分時(shí),為了按系列生產(chǎn)商品,使用抽象工廠區(qū)分。
比如不同水果有不同包裝規(guī)格,客戶下單時(shí),自動(dòng)配出包裝,

--生產(chǎn)蘋果,配置紙箱包裝

--生產(chǎn)香蕉時(shí),配置竹蘿包裝

PS:保證客戶端只使用同一個(gè)產(chǎn)品族中的對(duì)象(如下代碼的AppleFactory,BananaFactory)。

/**
 * 抽象水果工廠
 */
public abstract class AbstractFactory {

    public abstract  Fruit getFruit();

    public abstract Bag getBag();

}


/**
 * 水果工廠
 */
public class AppleFactory extends AbstractFactory{

    @Override
    public Fruit getFruit() {
        return new Apple();
    }

    @Override
    public Bag getBag() {
        return new AppleBag();
    }
}

/**
 * 水果工廠
 */
public class BananaFactory extends AbstractFactory{

    @Override
    public Fruit getFruit() {
        return new Banana();
    }

    @Override
    public Bag getBag() {
        return new BananaBag();
    }
}

/**
 * 抽象工廠模式測(cè)試
 * 按訂單發(fā)送貨品給客戶
 * Created by Peter on 10/8 008.
 */
public class OrderSendClient {
    public static void main(String[] args){
        sendFruit();
    }

    public static void sendFruit(){
        //初始化工廠
        AbstractFactory factory = new AppleFactory();//spring使用注入方式

        //得到水果
        Fruit fruit = factory.getFruit();
        fruit.draw();
        //得到包裝
        Bag bag = factory.getBag();
        bag.pack();
        //以下物流運(yùn)輸業(yè)務(wù)。。。。

    }

}

抽象工廠模式類圖

代碼地址:https://github.com/lovemumu/F...

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

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

相關(guān)文章

  • Spring框架我見()——工廠模式

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

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

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

    aisuhua 評(píng)論0 收藏0
  • 設(shè)計(jì)模式抽象工廠

    摘要:類圖上面的這張圖引用設(shè)計(jì)模式之禪關(guān)于抽象工廠的通用類圖,說實(shí)話,我覺得這張圖很難懂,不容易表述抽象工廠模式也或許是個(gè)人理解能力。 前言 關(guān)于抽象工廠模式,博主初學(xué)的時(shí)候是懵逼的,花了好大力氣才明白它與工廠模式的異同,不得不說理解能力還有待加強(qiáng)(~。~) 什么是抽象工廠模式 為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無須指定它們的具體類。 讓我們?cè)倩仡櫹鹿S模式的定義: 定義一個(gè)用...

    VincentFF 評(píng)論0 收藏0
  • 個(gè)設(shè)計(jì)模式JS實(shí)現(xiàn)——工廠模式

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

    Muninn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<