【設(shè)計(jì)模式自習(xí)室】理解工廠模式的三種形式

前言

《設(shè)計(jì)模式自習(xí)室》系列,顧名思義,本系列文章帶你溫習(xí)常見的設(shè)計(jì)模式。主要內(nèi)容有:

  • 該模式的介紹,包括:
    • 引子、意圖(大白話解釋)
    • 類圖、時(shí)序圖(理論規(guī)范)
  • 該模式的代碼示例:熟悉該模式的代碼長(zhǎng)什么樣子
  • 該模式的優(yōu)缺點(diǎn):模式不是萬(wàn)金油,不可以濫用模式
  • 該模式的實(shí)際使用案例:了解它在哪些重要的源碼中被使用

該系列會(huì)逐步更新于我的博客和公眾號(hào)(博客見文章底部)

也希望各位觀眾老爺能夠關(guān)注我的個(gè)人公眾號(hào):后端技術(shù)漫談,不會(huì)錯(cuò)過精彩好看的文章。

系列文章回顧

創(chuàng)建型——簡(jiǎn)單工廠/工廠模式/抽象工廠

引子

工廠模式是一個(gè)非常重要的創(chuàng)建型模式,但是工廠模式又分為好多種,并且網(wǎng)上文章很多,很多對(duì)工廠模式的定義都不是很明確,甚至還互相沖突,本文希望通過放在一起串講的形式,力求能夠用最簡(jiǎn)潔的語(yǔ)言理清工廠模式。

先看一個(gè)工廠模式的定義:

“Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.”(在基類中定義創(chuàng)建對(duì)象的一個(gè)接口,讓子類決定實(shí)例化哪個(gè)類。工廠方法讓一個(gè)類的實(shí)例化延遲到子類中進(jìn)行。)

使用了工廠模式,我們可以將對(duì)象的創(chuàng)建和使用分離。用來防止用來實(shí)例化一個(gè)類的數(shù)據(jù)和代碼在多個(gè)類中到處都是。

工廠模式最主要的形式是以下三種:

  • 簡(jiǎn)單/靜態(tài)工廠(Simple Factory)
  • 工廠方法(Factory Method)
  • 抽象工廠(Abstract Factory)

意圖

1. 簡(jiǎn)單/靜態(tài)工廠(Simple Factory)

先來看簡(jiǎn)單工廠模式,它指的是,在創(chuàng)建一個(gè)對(duì)象時(shí)不向客戶暴露內(nèi)部細(xì)節(jié),并提供一個(gè)創(chuàng)建對(duì)象的通用接口。

在簡(jiǎn)單工廠模式中,可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。

2. 工廠方法(Factory Method)

工廠方法又可以稱為:

  • 工廠模式
  • 虛擬構(gòu)造器(Virtual Constructor)模式
  • 多態(tài)工廠(Polymorphic Factory)模式

工廠模式通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。不再設(shè)計(jì)一個(gè)工廠類來統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體產(chǎn)品的創(chuàng)建過程交給專門的工廠子類去完成。

這一特點(diǎn)無疑使得工廠方法模式具有超越簡(jiǎn)單工廠模式的優(yōu)越性,更加符合“開閉原則”。

3. 抽象工廠(Abstract Factory)

在了解抽象工廠之前,我們先要了解下什么是產(chǎn)品等級(jí)結(jié)構(gòu)和產(chǎn)品族

產(chǎn)品族 :在抽象工廠模式中,產(chǎn)品族是指由同一個(gè)工廠生產(chǎn)的,位于不同產(chǎn)品等級(jí)結(jié)構(gòu)中的一組產(chǎn)品,如海爾電器工廠生產(chǎn)的海爾電視機(jī)、海爾電冰箱,海爾電視機(jī)位于電視機(jī)產(chǎn)品等級(jí)結(jié)構(gòu)中,海爾電冰箱位于電冰箱產(chǎn)品等級(jí)結(jié)構(gòu)中。

產(chǎn)品等級(jí)結(jié)構(gòu) :產(chǎn)品等級(jí)結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個(gè)抽象類是電視機(jī),其子類有海爾電視機(jī)、海信電視機(jī)、TCL電視機(jī),則抽象電視機(jī)與具體品牌的電視機(jī)之間構(gòu)成了一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),抽象電視機(jī)是父類,而具體品牌的電視機(jī)是其子類。

工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),而抽象工廠模式則需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),一個(gè)工廠等級(jí)結(jié)構(gòu)可以負(fù)責(zé)多個(gè)不同產(chǎn)品等級(jí)結(jié)構(gòu)中的產(chǎn)品對(duì)象的創(chuàng)建 。

抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)。

如果看到這里還是對(duì)抽象工廠理解不夠,不要著急,下方的代碼示例會(huì)給你加深理解。

類圖

如果看不懂UML類圖,可以先粗略瀏覽下該圖,想深入了解的話,可以繼續(xù)谷歌,深入學(xué)習(xí):

image

1. 簡(jiǎn)單/靜態(tài)工廠(Simple Factory)

image

簡(jiǎn)單工廠模式包含如下角色:

  • Factory:工廠角色 負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯
  • Product:抽象產(chǎn)品角色 是所創(chuàng)建的所有對(duì)象的父類,負(fù)責(zé)描述所有實(shí)例所共有的公共接口
  • ConcreteProduct:具體產(chǎn)品角色 是創(chuàng)建目標(biāo),所有創(chuàng)建的對(duì)象都充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例。

2. 工廠方法(Factory Method)

image

(相比簡(jiǎn)單工廠,將工廠變?yōu)榱顺橄蠊S和具體工廠)

  • Factory:抽象工廠,擔(dān)任這個(gè)角色的是工廠方法模式的核心,任何在模式中創(chuàng)建對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口。在實(shí)際的系統(tǒng)中,這個(gè)角色也常常使用抽象類實(shí)現(xiàn)。
  • ConcreteFactory:具體工廠,擔(dān)任這個(gè)角色的是實(shí)現(xiàn)了抽象工廠接口的具體Java類。具體工廠角色含有與業(yè)務(wù)密切相關(guān)的邏輯,并且受到使用者的調(diào)用以創(chuàng)建具體產(chǎn)品對(duì)象。
  • Product:抽象產(chǎn)品,工廠方法模式所創(chuàng)建的對(duì)象的超類,也就是所有產(chǎn)品類的共同父類或共同擁有的接口。在實(shí)際的系統(tǒng)中,這個(gè)角色也常常使用抽象類實(shí)現(xiàn)。
  • ConcreteProduct:具體產(chǎn)品,這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品(Product)所聲明的接口,工廠方法模式所創(chuàng)建的每一個(gè)對(duì)象都是某個(gè)具體產(chǎn)品的實(shí)例。

3. 抽象工廠(Abstract Factory)

image

抽象工廠模式包含如下角色:

  • AbstractFactory:抽象工廠
  • ConcreteFactory:具體工廠
  • AbstractProduct:抽象產(chǎn)品
  • ConcreteProduct:具體產(chǎn)品

你會(huì)發(fā)現(xiàn)工廠模式和抽象工廠的角色是相同的。

時(shí)序圖

時(shí)序圖(Sequence Diagram)是顯示對(duì)象之間交互的圖,這些對(duì)象是按時(shí)間順序排列的。時(shí)序圖中顯示的是參與交互的對(duì)象及其對(duì)象之間消息交互的順序。

我們可以大致瀏覽下時(shí)序圖,如果感興趣的小伙伴可以去深究一下:

1. 簡(jiǎn)單/靜態(tài)工廠(Simple Factory)

image

2. 工廠方法(Factory Method)

image

3. 抽象工廠(Abstract Factory)

image

代碼樣例

給出的代碼中,每個(gè)類都以角色來區(qū)分

1. 簡(jiǎn)單/靜態(tài)工廠(Simple Factory)

代碼來自:

http://www.itdecent.cn/p/d1b6731c1c0e

工廠——LoginManager
public class LoginManager {
    public static Login factory(String type){
        if(type.equals("password")){
            
            return new PasswordLogin();
            
        }else if(type.equals("passcode")){
            
            return new DomainLogin();
            
        }else{
            /**
             * 這里拋出一個(gè)自定義異常會(huì)更恰當(dāng)
             */
            throw new RuntimeException("沒有找到登錄類型");
        }
    }
}
抽象產(chǎn)品——Login接口
public interface Login {
    //登錄驗(yàn)證
    public boolean verify(String name , String password);
}
具體產(chǎn)品——PasswordLogin
public class PasswordLogin implements Login {

    @Override
    public boolean verify(String name, String password) {
        // TODO Auto-generated method stub
        /**
         * 業(yè)務(wù)邏輯
         */
        return true;
    }
}

客戶端調(diào)用

public class Test {
    public static void main(String[] args) {
        String loginType = "password";
        String name = "name";
        String password = "password";
        Login login = LoginManager.factory(loginType);
        boolean bool = login.verify(name, password);
        if (bool) {
            /**
             * 業(yè)務(wù)邏輯
             */
        } else {
            /**
             * 業(yè)務(wù)邏輯
             */
        }
    }
}

假如不使用上面的簡(jiǎn)單工廠模式則驗(yàn)證登錄Servlet代碼如下,可以看到代碼耦合度很高:

public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        String loginType = "password";
        String name = "name";
        String password = "password";
        //處理口令認(rèn)證
        if(loginType.equals("password")){
            PasswordLogin passwordLogin = new PasswordLogin();
            boolean bool = passwordLogin.verify(name, password);
            if (bool) {
                /**
                 * 業(yè)務(wù)邏輯
                 */
            } else {
                /**
                 * 業(yè)務(wù)邏輯
                 */
            }
        }
        //處理域認(rèn)證
        else if(loginType.equals("passcode")){
            DomainLogin domainLogin = new DomainLogin();
            boolean bool = domainLogin.verify(name, password);
            if (bool) {
                /**
                 * 業(yè)務(wù)邏輯
                 */
            } else {
                /**
                 * 業(yè)務(wù)邏輯
                 */
            }    
        }else{
            /**
             * 業(yè)務(wù)邏輯
             */
        }
    }
}

2. 工廠方法(Factory Method)

代碼來自:http://www.itdecent.cn/p/1cf9859e0f7c

(相比簡(jiǎn)單工廠,將工廠變?yōu)榱顺橄蠊S和具體工廠)

抽象的產(chǎn)品接口——ILight:具備開關(guān)兩種功能的產(chǎn)品

public interface ILight
    {
        void TurnOn();
        void TurnOff();
    }

具體的產(chǎn)品類——BulbLight

 public class TubeLight implements ILight
    {
        public void TurnOn()
        {
            Console.WriteLine("TubeLight turns on.");
        }

        public void TurnOff()
        {
            Console.WriteLine("TubeLight turns off.");
        }

    }

抽象的工廠類——ICreator

public interface ICreator
    {
        ILight CreateLight();
    }

具體的工廠類——BulbCreator

 public class BulbCreator implements ICreator
    {
        public ILight CreateLight()
        {
            return new BulbLight();
        }

    }

客戶端調(diào)用

static void Main(string[] args)
        {
            //先給我來個(gè)燈泡
            ICreator creator = new BulbCreator();
            ILight light = creator.CreateLight();
            light.TurnOn();
            light.TurnOff();

            //再來個(gè)燈管看看
            creator = new TubeCreator();
            light = creator.CreateLight();
            light.TurnOn();
            light.TurnOff();
        }

本例中每個(gè)具體工廠類只負(fù)責(zé)生產(chǎn)一種類型的產(chǎn)品,當(dāng)然每個(gè)具體工廠類也內(nèi)部可以維護(hù)少數(shù)幾種產(chǎn)品實(shí)例對(duì)象,類似于簡(jiǎn)單工廠模式。

3. 抽象工廠(Abstract Factory)

代碼來自:http://www.itdecent.cn/p/d6622f3e71ed

抽象產(chǎn)品: 蘋果系列

public interface Apple
     {
        void AppleStyle();
    }

抽象產(chǎn)品: 三星系列

public interface Sumsung
     {
        void BangziStyle();
   }

具體產(chǎn)品:iphone

public class iphone implements Apple
     {
         public void AppleStyle()
         {
            Console.WriteLine("Apple's style: iPhone!");
        }
     }

具體產(chǎn)品:ipad

 public class ipad implements Apple
    {
 
         public void AppleStyle()
        {
             Console.WriteLine("Apple's style: iPad!");
        }
 
     }

具體產(chǎn)品:note2

public class note2 implements Sumsung
     {
         public void BangziStyle()
         {
            Console.WriteLine("Bangzi's style : Note2!");
         }
 
     }

抽象工廠

public interface Factory
     {
         Apple createAppleProduct();
         Sumsung createSumsungProduct();
     }

手機(jī)工廠

public class Factory_Phone implements Factory
     {
         public Apple createAppleProduct()
         {
             return new iphone();
         }
 
         public Sumsung createSumsungProduct()
         {
             return new note2();
         }
     }

pad工廠

public class Factory_Pad implements  Factory
     {
         public Apple createAppleProduct()
         {
             return new ipad();
         }
 
         public Sumsung createSumsungProduct()
         {
             return new Tabs();
         }
     }

客戶端調(diào)用

public static void Main(string[] args)
         {
              //采購(gòu)商要一臺(tái)iPad和一臺(tái)Tab
              Factory factory = new Factory_Pad();
              Apple apple = factory.createAppleProduct();
              apple.AppleStyle();
              Sumsung sumsung = factory.createSumsungProduct();
              sumsung.BangziStyle();
  
             //采購(gòu)商又要一臺(tái)iPhone和一臺(tái)Note2
             factory = new Factory_Phone();
             apple = factory.createAppleProduct();
             apple.AppleStyle();
             sumsung = factory.createSumsungProduct();
             sumsung.BangziStyle();
         }

下面的代碼是剛才已經(jīng)看過的工廠模式的調(diào)用代碼,對(duì)比下,發(fā)現(xiàn)區(qū)別了嗎?工廠方法只需要管是哪個(gè)產(chǎn)品族,而抽象工廠還要考慮產(chǎn)品的等級(jí)結(jié)構(gòu),也就是他是蘋果造的,還是三星造的。盡管他們都是手機(jī)!

static void Main(string[] args)
        {
            //先給我來個(gè)燈泡
            ICreator creator = new BulbCreator();
            ILight light = creator.CreateLight();
            light.TurnOn();
            light.TurnOff();

            //再來個(gè)燈管看看
            creator = new TubeCreator();
            light = creator.CreateLight();
            light.TurnOn();
            light.TurnOff();
        }

用意圖里面的話再次總結(jié)一下:

工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),而抽象工廠模式則需要面對(duì)多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu),一個(gè)工廠等級(jí)結(jié)構(gòu)可以負(fù)責(zé)多個(gè)不同產(chǎn)品等級(jí)結(jié)構(gòu)中的產(chǎn)品對(duì)象的創(chuàng)建 。

優(yōu)缺點(diǎn)

1. 簡(jiǎn)單/靜態(tài)工廠(Simple Factory)

優(yōu)點(diǎn)
  • 構(gòu)造容易,邏輯簡(jiǎn)單。
缺點(diǎn)
  • 簡(jiǎn)單工廠模式中的if else判斷非常多,完全是Hard Code,如果有一個(gè)新產(chǎn)品要加進(jìn)來,就要同時(shí)添加一個(gè)新產(chǎn)品類,并且必須修改工廠類,再加入一個(gè) else if 分支才可以, 這樣就違背了 “開放-關(guān)閉原則“中的對(duì)修改關(guān)閉的準(zhǔn)則了。
  • 一個(gè)工廠類中集合了所有的類的實(shí)例創(chuàng)建邏輯,違反了高內(nèi)聚的責(zé)任分配原則,將全部的創(chuàng)建邏輯都集中到了一個(gè)工廠類當(dāng)中,所有的業(yè)務(wù)邏輯都在這個(gè)工廠類中實(shí)現(xiàn)。什么時(shí)候它不能工作了,整個(gè)系統(tǒng)都會(huì)受到影響。因此一般只在很簡(jiǎn)單的情況下應(yīng)用,比如當(dāng)工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少時(shí)。
  • 簡(jiǎn)單工廠模式由于使用了靜態(tài)工廠方法,造成工廠角色無法形成基于繼承的等級(jí)結(jié)構(gòu)。

2. 工廠方法(Factory Method)

優(yōu)點(diǎn)
  • 在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對(duì)應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),甚至無須知道具體產(chǎn)品類的類名。
  • 工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。
  • 使用工廠方法模式的另一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中加入新產(chǎn)品時(shí),無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,完全符合“開閉原則”,這點(diǎn)比簡(jiǎn)單工廠模式更優(yōu)秀。
缺點(diǎn)
  • 在添加新產(chǎn)品時(shí),需要編寫新的具體產(chǎn)品類,而且還要提供與之對(duì)應(yīng)的具體工廠類,系統(tǒng)中類的個(gè)數(shù)將成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運(yùn)行,會(huì)給系統(tǒng)帶來一些額外的開銷。
  • 由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實(shí)現(xiàn)時(shí)可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度。

3. 抽象工廠(Abstract Factory)

優(yōu)點(diǎn)
  • 應(yīng)用抽象工廠模式可以實(shí)現(xiàn)高內(nèi)聚低耦合的設(shè)計(jì)目的,因此抽象工廠模式得到了廣泛的應(yīng)用。
  • 增加新的具體工廠和產(chǎn)品族很方便,因?yàn)橐粋€(gè)具體的工廠實(shí)現(xiàn)代表的是一個(gè)產(chǎn)品族,無須修改已有系統(tǒng),符合“開閉原則”。
缺點(diǎn)

開閉原則的傾斜性(增加新的工廠和產(chǎn)品族容易,增加新的產(chǎn)品等級(jí)結(jié)構(gòu)麻煩

使用場(chǎng)景舉例

1. 簡(jiǎn)單/靜態(tài)工廠(Simple Factory)

工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少:由于創(chuàng)建的對(duì)象較少,不會(huì)造成工廠方法中的業(yè)務(wù)邏輯太過復(fù)雜。

Java JDK中使用
  1. JDK類庫(kù)中廣泛使用了簡(jiǎn)單工廠模式,如工具類java.text.DateFormat,它用于格式化一個(gè)本地日期或者時(shí)間。
public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale
locale);
  1. Java加密技術(shù)
    獲取不同加密算法的密鑰生成器:
KeyGenerator keyGen=KeyGenerator.getInstance("DESede");
  1. 創(chuàng)建密碼器:
Cipher cp = Cipher.getInstance("DESede");

2. 工廠方法(Factory Method)

Java JDK中使用
  • JDBC中的工廠方法:
Connection conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=DB;user=sa;password=");
Statement statement=conn.createStatement();
ResultSet rs=statement.executeQuery("select * from UserInfo");

3. 抽象工廠(Abstract Factory)

在以下情況下可以使用抽象工廠模式:

  • 一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對(duì)于所有類型的工廠模式都是重要的。
  • 系統(tǒng)中有多于一個(gè)的產(chǎn)品族,而每次只使用其中某一產(chǎn)品族。(與工廠方法模式的區(qū)別)
  • 屬于同一個(gè)產(chǎn)品族的產(chǎn)品將在一起使用,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來。
  • 系統(tǒng)提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于具體實(shí)現(xiàn)。
Java JDK中使用

總結(jié)

抽象工廠模式中我們可以定義實(shí)現(xiàn)不止一個(gè)接口,一個(gè)工廠也可以生成不止一個(gè)產(chǎn)品類,抽象工廠模式較好的實(shí)現(xiàn)了“開放-封閉”原則,是三個(gè)模式中較為抽象,并具一般性的模式。

但是歸根結(jié)底,工廠模式還是一定程度上增加了代碼復(fù)雜度,有沒有一種辦法,不需要?jiǎng)?chuàng)建工廠,也能解決代碼以后的擴(kuò)展性問題呢?

答案是有的,通過控制反轉(zhuǎn)(ioc),對(duì)象在被創(chuàng)建的時(shí)候,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體,將其所依賴的對(duì)象的引用傳遞給它。也可以說,依賴被注入到對(duì)象中。(DI),也就是Spring最核心的思想了。大家可以自行查閱Spring思想的文章。

話說,最近也真的想總結(jié)一下Spring源碼相關(guān)的知識(shí),正在學(xué)習(xí)中。

參考

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

相關(guān)閱讀更多精彩內(nèi)容

  • 工廠模式是我們最常用的實(shí)例化對(duì)象模式了,是用工廠方法代替new操作的一種模式。通常我們所說的工廠模式是指工廠方法模...
    zfylin閱讀 1,403評(píng)論 0 7
  • 工廠方法模式通過引入工廠等級(jí)結(jié)構(gòu),解決了簡(jiǎn)單工廠模式中工廠類職責(zé)太重的問題,但由于工廠方法模式中的每個(gè)工廠只生產(chǎn)一...
    justCode_閱讀 1,293評(píng)論 1 6
  • 簡(jiǎn)單工廠模式雖然簡(jiǎn)單,但存在一個(gè)很嚴(yán)重的問題。當(dāng)系統(tǒng)中需要引入新產(chǎn)品時(shí),由于靜態(tài)工廠方法通過所傳入?yún)?shù)的不同來創(chuàng)建...
    justCode_閱讀 1,304評(píng)論 1 9
  • 設(shè)計(jì)原則: 要依賴抽象,不要依賴具體類 目錄 本文的結(jié)構(gòu)如下: 什么是抽象工廠模式 為什么要用該模式 模式的結(jié)構(gòu) ...
    w1992wishes閱讀 1,229評(píng)論 0 6
  • 我沒有記錯(cuò) 兩個(gè)月前的現(xiàn)在 我正送你回家 也記得 送你到家后我并沒有下車 徑自乘車而去 搖開車窗 只剩下你留給我的...
    洪少的洪閱讀 253評(píng)論 1 0

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