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

資訊專欄INFORMATION COLUMN

一起學設計模式 - 工廠模式

wanglu1209 / 3612人閱讀

摘要:抽象工廠模式提供了創(chuàng)建一系列相互依賴對象的接口,無需指定具體類抽象工廠模式是圍繞著一個超級工廠工作,創(chuàng)造其它的工廠類,也被稱為工廠的工廠,這種類型的設計模式是創(chuàng)造性的模式,因為這種模式提供了創(chuàng)建對象的最佳方法之一。

工廠模式是JAVA中最常用的設計模式之一,使用工廠模式后,創(chuàng)建對象的時候不在將創(chuàng)建邏輯暴露給客戶端,而是通過實現(xiàn)接口的方式創(chuàng)建對象,這種設計模式也是對象實例化的最佳方式。

概述

工廠模式的三種形態(tài)

簡單工廠(Simple Factory)

工廠方法(Factory Method)

抽象工廠(Abstract Factory)

簡單工廠

簡單工廠模式屬于工廠模式的小弟,未被收納進GOF 23中,但是也被頻繁使用

1.創(chuàng)建一個Animal接口

interface Shape {
    void draw();
}

2.創(chuàng)建DogPig實現(xiàn)Animal接口

class Circle implements Shape {
    public Circle() {
        System.out.println("創(chuàng)建圓形模型");
    }

    @Override
    public void draw() {
        System.out.println("畫了一個圓形");
    }
}

class Square implements Shape {
    public Square() {
        System.out.println("創(chuàng)建了方形模型");
    }

    @Override
    public void draw() {
        System.out.println("畫了一個方形");
    }
}

3.創(chuàng)建工廠類SimpleFactory,定義一個基于參數(shù)信息實例化具體對象的方法

public class SimpleFactory {

    private final static String CIRCLE = "CIRCLE";
    private final static String SQUARE = "SQUARE";

    public static Shape getFactory(String type) {
        switch (type) {
            case CIRCLE:
                return new Circle();
            case SQUARE:
                return new Square();
            default:
                throw new NullPointerException("未描繪任何圖形");
        }
    }

    public static void main(String[] args) {
        Shape circle = SimpleFactory.getFactory(CIRCLE);
        circle.draw();

        Shape square = SimpleFactory.getFactory(SQUARE);
        square.draw();
    }
}

4.日志

創(chuàng)建圓形模型
畫了一個圓形
創(chuàng)建了方形模型
畫了一個方形

分析: 從上述代碼中可以發(fā)現(xiàn),簡單工廠擁有一定判斷能力,構(gòu)建結(jié)果取決于入?yún)?,使用起來也十分的方便,也正因為使?b>太過方便而導致高耦合的情況,所有對象實例化都需要依賴它,一旦出問題,影響的會是整個系統(tǒng)

使用場景: 創(chuàng)建簡單,無復雜業(yè)務邏輯的對象

工廠方法

前面說到過簡單工廠模式存在耦合,且違反了開閉原則,那么這一問題在工廠方法模式中可以很容易的解決掉,它可以做到添加新的產(chǎn)品而不破壞已有代碼

工廠方法模式:定義一個創(chuàng)建對象的接口,由它的實現(xiàn)類來決定具體實現(xiàn),其模式又被稱為工廠模式(Factory Pattern)。

1.新增ImageReaderFactory抽象工廠接口,用來構(gòu)建具體的對象

interface ImageReader {
    void read();
}
interface ImageReaderFactory {
    ImageReader create();
}

2.相比單一實例化的簡單工廠模式而言,方法工廠模式更加的靈活,針對不同的產(chǎn)品(圖片讀取器)提供不同的工廠。

class JpgReader implements ImageReader {
    public JpgReader() {
        System.out.println("創(chuàng)建Jpg讀取器");
    }

    @Override
    public void read() {
        System.out.println("讀取Jpg文件");
    }
}

class PngReader implements ImageReader {
    public PngReader() {
        System.out.println("創(chuàng)建Png讀取器");
    }

    @Override
    public void read() {
        System.out.println("讀取Png文件");
    }
}
class JpgFactory implements ImageReaderFactory {
    @Override
    public ImageReader create() {
        System.out.println("實例化Jpg文件工廠");
        return new JpgReader();
    }
}

class PngFactory implements ImageReaderFactory {
    @Override
    public ImageReader create() {
        System.out.println("實例化Png文件工廠");
        return new PngReader();
    }
}

3.創(chuàng)建測試類,當然實際使用過程中,實現(xiàn)工廠方法除了可以實例化具體對象,還可以初始化某些資源配置,比如連接池、創(chuàng)建文件等

public class MethodFactory {
    public static void main(String[] args) {
        ImageReaderFactory png = new PngFactory();
        ImageReader pngReader = png.create();
        pngReader.read();

        ImageReaderFactory jpg = new JpgFactory();
        ImageReader jpgReader = jpg.create();
        jpgReader.read();
    }
}

4.日志

實例化Png文件工廠
創(chuàng)建Png讀取器
讀取Png文件
實例化Jpg文件工廠
創(chuàng)建Jpg讀取器
讀取Jpg文件

優(yōu)點:

屏蔽了客戶端實例化對象的細節(jié),用戶只需要關心自己使用的工廠即可。

加入新的產(chǎn)品(圖片讀取器),無需更改現(xiàn)有代碼,提高系統(tǒng)擴展性,符合開閉原則

具備多態(tài)性,又被稱為多態(tài)工廠模式

缺點: 每次需要編寫新的對象和對象工廠類,隨業(yè)務發(fā)展,一定程度上增加了系統(tǒng)復雜度

抽象工廠

抽象工廠模式是為創(chuàng)建一組對象提供提供的解決方案,與工廠方法模式相比,抽象工廠模式中的具體工廠不只是創(chuàng)建某一種產(chǎn)品,而是負責一組(產(chǎn)品族)。

抽象工廠模式(Abstract Factory Pattern):提供了創(chuàng)建一系列相互依賴對象的接口,無需指定具體類

抽象工廠模式是圍繞著一個超級工廠工作,創(chuàng)造其它的工廠類,也被稱為工廠的工廠,這種類型的設計模式是創(chuàng)造性的模式,因為這種模式提供了創(chuàng)建對象的最佳方法之一。

起源

抽象工廠模式的起源或者最早的應用,是用于創(chuàng)建分屬于不同操作系統(tǒng)的視窗構(gòu)建。比如:命令按鍵(Button)與文字框(Text)都是視窗構(gòu)建,在UNIX操作系統(tǒng)的視窗環(huán)境和Windows操作系統(tǒng)的視窗環(huán)境中,這兩個構(gòu)建有不同的本地實現(xiàn),它們的細節(jié)有所不同。

在每一個操作系統(tǒng)中,都有一個視窗構(gòu)建組成的構(gòu)建家族。在這里就是Button和Text組成的產(chǎn)品族。而每一個視窗構(gòu)件都構(gòu)成自己的等級結(jié)構(gòu),由一個抽象角色給出抽象的功能描述,而由具體子類給出不同操作系統(tǒng)下的具體實現(xiàn)。

可以發(fā)現(xiàn)在上面的產(chǎn)品類圖中,有兩個產(chǎn)品的等級結(jié)構(gòu),分別是Button等級結(jié)構(gòu)和Text等級結(jié)構(gòu)。同時有兩個產(chǎn)品族,也就是UNIX產(chǎn)品族和Windows產(chǎn)品族。UNIX產(chǎn)品族由UNIX Button和UNIX Text產(chǎn)品構(gòu)成;而Windows產(chǎn)品族由Windows Button和Windows Text產(chǎn)品構(gòu)成。

系統(tǒng)對產(chǎn)品對象的創(chuàng)建需求由一個工程的等級結(jié)構(gòu)滿足,其中有兩個具體工程角色,即UnixFactory和WindowsFactory。UnixFactory對象負責創(chuàng)建Unix產(chǎn)品族中的產(chǎn)品,而WindowsFactory對象負責創(chuàng)建Windows產(chǎn)品族中的產(chǎn)品。這就是抽象工廠模式的應用,抽象工廠模式的解決方案如下圖:

顯然,一個系統(tǒng)只能夠在某一個操作系統(tǒng)的視窗環(huán)境下運行,而不能同時在不同的操作系統(tǒng)上運行。所以,系統(tǒng)實際上只能消費屬于同一個產(chǎn)品族的產(chǎn)品。

在現(xiàn)代的應用中,抽象工廠模式的使用范圍已經(jīng)大大擴大了,不再要求系統(tǒng)只能消費某一個產(chǎn)品族了。因此,可以不必理會前面所提到的原始用意。

摘抄自《JAVA與模式》之抽象工廠模式:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html

需求: 開發(fā)一款《王者榮耀》,支持多操作系統(tǒng)和多控制方式操作控制界面控制,并提供相應的工廠類來封裝這些類的初始化過程

1.創(chuàng)建不同的操作系統(tǒng)接口

interface Linux {
    void controller();
}

interface Windows {
    void controller();
}

2.基于不同操作系統(tǒng)實現(xiàn)控制邏輯

class LinuxController implements Linux {
    @Override
    public void controller() {
        System.out.println("Linux 控制 《王者榮耀》");
    }
}

class WindowsController implements Windows {
    @Override
    public void controller() {
        System.out.println("Windows 控制 《王者榮耀》");
    }
}

3.創(chuàng)建一個工廠類,基于接口分別實現(xiàn)操作控制界面控制兩種方式的工廠

interface AbstractFactory {
    Linux installLinux();

    Windows installWindows();
}

class OperationFactory implements AbstractFactory {

    @Override
    public Linux installLinux() {
        System.out.println("安裝Linux操作控制系統(tǒng)");
        return new LinuxController();
    }

    @Override
    public Windows installWindows() {
        System.out.println("安裝Windows操作控制系統(tǒng)");
        return new WindowsController();
    }
}

class InterfaceFactory implements AbstractFactory {
    @Override
    public Linux installLinux() {
        System.out.println("安裝Linux界面控制系統(tǒng)");
        return new LinuxController();
    }

    @Override
    public Windows installWindows() {
        System.out.println("安裝Windows界面控制系統(tǒng)");
        return new WindowsController();
    }
}

4.創(chuàng)建《王者榮耀》進行測試

public class KingGlory {

    public static void main(String[] args) {

        AbstractFactory operationFactory = new OperationFactory();
        operationFactory.installLinux().controller();
        operationFactory.installWindows().controller();
        System.out.println("========================================================");
        AbstractFactory interfaceFactory = new InterfaceFactory();
        interfaceFactory.installLinux().controller();
        interfaceFactory.installWindows().controller();

    }
}

5.日志

安裝Linux操作控制系統(tǒng)
Linux 控制 《王者榮耀》
安裝Windows操作控制系統(tǒng)
Windows 控制 《王者榮耀》
========================================================
安裝Linux界面控制系統(tǒng)
Linux 控制 《王者榮耀》
安裝Windows界面控制系統(tǒng)
Windows 控制 《王者榮耀》
分析

使用抽象工廠模式來定義的一系列對象通常是相關或相互依賴的,這些產(chǎn)品對象就構(gòu)成了一個產(chǎn)品族,也就是抽象工廠定義了一個產(chǎn)品族。這就帶來非常大的靈活性,切換產(chǎn)品族的時候,只要提供不同的抽象工廠實現(xiàn)就可以了,也就是說現(xiàn)在是以一個產(chǎn)品族作為一個整體被切換,從上文中可以發(fā)現(xiàn),如果我們需要切換控制方式,只需要變更下對應的工廠類即可

優(yōu)點:

分離接口和實現(xiàn):客戶端使用抽象工廠來創(chuàng)建需要的對象,而客戶端根本就不知道具體的實現(xiàn)是誰,客戶端只是面向產(chǎn)品的接口編程而已。也就是說,客戶端從具體的產(chǎn)品實現(xiàn)中解耦。

切換產(chǎn)品族變得容易:對于增加新的產(chǎn)品族,抽象工廠模式很好地支持了開閉原則,只需要增加具體產(chǎn)品并對應增加一個新的具體工廠,對已有代碼無須做任何修改(如:新增一種手柄操作支持)。

缺點:

不易擴展新產(chǎn)品:如果需要給整個產(chǎn)品族添加一個新的產(chǎn)品,那么就需要修改抽象工廠,這樣就會導致修改所有的工廠實現(xiàn)類(如:新增一種操作系統(tǒng)的支持,那么Factory代碼需要全部修改)。

使用場景:

一個系統(tǒng)不應當依賴于產(chǎn)品類實例如何被創(chuàng)建、組合和表達的細節(jié),這對于所有形態(tài)的工廠模式都是重要的。

這個系統(tǒng)的產(chǎn)品有多于一個的產(chǎn)品族,而系統(tǒng)只消費其中某一族的產(chǎn)品。

同屬于同一個產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設計中體現(xiàn)出來。

系統(tǒng)提供一個產(chǎn)品類的庫,所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實現(xiàn)。

- 說點什么

全文代碼:https://gitee.com/battcn/design-pattern/tree/master/Chapter1/battcn-factory

個人QQ:1837307557

battcn開源群(適合新手):391619659

微信公眾號:battcn(歡迎調(diào)戲)

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

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

相關文章

  • 一起設計模式 - 享元模式

    摘要:享元模式屬于結(jié)構(gòu)型模式的一種,又稱輕量級模式,通過共享技術有效地實現(xiàn)了大量細粒度對象的復用概述兩種結(jié)構(gòu)狀態(tài)內(nèi)部狀態(tài)享元對象內(nèi)部不隨外界環(huán)境改變而改變的共享部分。 享元模式(Flyweight Pattern)屬于結(jié)構(gòu)型模式的一種,又稱輕量級模式,通過共享技術有效地實現(xiàn)了大量細粒度對象的復用... 概述 兩種結(jié)構(gòu)狀態(tài) 內(nèi)部狀態(tài):享元對象內(nèi)部不隨外界環(huán)境改變而改變的共享部分。 外部狀態(tài)...

    Jason 評論0 收藏0
  • 一起設計模式 - 建造者模式

    摘要:構(gòu)造函數(shù)參數(shù)太多錯誤的對象狀態(tài)使用模式在我們的示例中,改造下召喚師類齊天大圣孫悟空上單基石天賦戰(zhàn)爭雷霆瘟疫之源圖奇下路基石天賦戰(zhàn)陣熱誠皎月女神戴安娜中單建造者模式讓我們寫的代碼更具可讀性,可理解為建立復雜的物體。 建造者模式(Builder Pattern)屬于創(chuàng)建型模式的一種,將多個簡單對象構(gòu)建成一個復雜的對象,構(gòu)建過程抽象化,不同實現(xiàn)方法可以構(gòu)造出不同表現(xiàn)(屬性)的對象,還提供了一...

    MockingBird 評論0 收藏0
  • 練就Java24章真經(jīng)—你所不知道的工廠方法

    摘要:用專業(yè)的話來講設計模式是一套被反復使用多數(shù)人知曉的經(jīng)過分類編目的代碼設計經(jīng)驗的總結(jié)創(chuàng)建型模式,共五種工廠方法模式抽象工廠模式單例模式建造者模式原型模式。工廠方法模式的擴展性非常優(yōu)秀。工廠方法模式是典型的解耦框架。 前言 最近一直在Java方向奮斗《終于,我還是下決心學Java后臺了》,今天抽空開始學習Java的設計模式了。計劃有時間就去學習,你這么有時間,還不來一起上車嗎? 之所以要學...

    Chiclaim 評論0 收藏0
  • 一起設計模式 - 原型模式

    摘要:原型模式是創(chuàng)建模式的一種,其作用是提高創(chuàng)建效率,減少計算機資源開銷,與工廠模式類似的是,都屏蔽了對象實例化的過程概述原型模式是模式的一種,其特點就是通過克隆拷貝的方式來,節(jié)約創(chuàng)建成本和資源,被拷貝的對象模型就稱之為原型。 原型模式(Prototype Pattern)是創(chuàng)建模式的一種,其作用是提高創(chuàng)建效率,減少計算機資源開銷,與工廠模式類似的是,都屏蔽了對象實例化的過程... 概述 ...

    DevTalking 評論0 收藏0

發(fā)表評論

0條評論

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