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

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

何時(shí)使用

  • 用戶需要一個(gè)類的子類的實(shí)例,但不希望與該類的子類形成耦合
  • 用戶需要一個(gè)類的子類的實(shí)例,但用戶不知道該類有哪些子類可用

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

  • 使用工廠方法可以讓用戶的代碼和某個(gè)特定類的子類的代碼解耦
  • 工廠方法使用戶不必知道它所使用的對(duì)象是怎樣被創(chuàng)建的,只需知道該對(duì)象有哪些方法即可。

簡(jiǎn)單工廠模式

介紹工廠方法模式前,先介紹一下簡(jiǎn)單工廠模式,簡(jiǎn)單工廠模式也是一種工廠方法模式。
簡(jiǎn)單工廠模式又稱靜態(tài)工廠方法模式。從命名上就可以看出這個(gè)模式一定很簡(jiǎn)單。它存在的目的很簡(jiǎn)單:定義一個(gè)用于創(chuàng)建對(duì)象的接口。
如果一個(gè)一些對(duì)象(產(chǎn)品),已經(jīng)確定了并不易改變和添加新的產(chǎn)品,那么久可以使用簡(jiǎn)單工廠模式。下面就是簡(jiǎn)單工廠的例子:

//演示簡(jiǎn)單工廠
public class SimpleFactory {
    public static void main(String args[]) throws Exception{
        Factory factory = new Factory();
        factory.produce("PRO5").run();
        factory.produce("PRO6").run();
    }
}
//抽象產(chǎn)品
interface MeizuPhone{
    void run();
}
//具體產(chǎn)品X2
class PRO5 implements MeizuPhone{
    @Override
    public void run() {
        System.out.println("我是一臺(tái)PRO5");
    }
}
class PRO6 implements MeizuPhone{
    @Override
    public void run() {
        System.out.println("我是一臺(tái)PRO6");
    }
}
//工廠
class Factory{
    MeizuPhone produce(String product) throws Exception{
        if(product.equals("PRO5"))
            return new PRO5();
        else if(product.equals("PRO6"))
            return new PRO6();
        throw new Exception("No Such Class");
    }
}

很容易看出,簡(jiǎn)單工廠模式是不易維護(hù)的,如果需要添加新的產(chǎn)品,則整個(gè)系統(tǒng)都需要修改。如果我們需要添加諸如PRO7、PRO8等產(chǎn)品,直接在工程類中添加即可。但是如果這時(shí)候根部不知道還有什么產(chǎn)品,只有到子類實(shí)現(xiàn)時(shí)才知道,這時(shí)候就需要工廠方法模式。
而在實(shí)際應(yīng)用中,很可能產(chǎn)品是一個(gè)多層次的樹(shù)狀結(jié)構(gòu)。由于簡(jiǎn)單工廠模式中只有一個(gè)工廠類來(lái)對(duì)應(yīng)這些產(chǎn)品,所以實(shí)現(xiàn)起來(lái)是比較麻煩的,那么工廠方法模式正式解決這個(gè)問(wèn)題的,下面就介紹工廠方法模式。

工廠方法模式

工廠方法模式去掉了簡(jiǎn)單工廠模式中工廠方法的靜態(tài)屬性,使得它可以被子類繼承。這樣在簡(jiǎn)單工廠模式里集中在工廠方法上的壓力可以由工廠方法模式里不同的工廠子類來(lái)分擔(dān)。
針對(duì)上面的例子,如果使用工廠方法模式,即將工廠定義為一個(gè)接口,然后由具體的工廠來(lái)確定需要生成什么樣的產(chǎn)品,為了與簡(jiǎn)單工廠比較,這里還是貼上代碼:

//工廠方法模式
public class FactoryMethod {
    public static void main(String args[]){
        IFactory bigfactory;
        bigfactory = new SmallFactory();
        bigfactory.produce().run();
        bigfactory = new BigFactory();
        bigfactory.produce().run();
    }
}
//抽象產(chǎn)品
interface MeizuPhone{
    void run();
}
//具體產(chǎn)品*2
class PRO5 implements MeizuPhone{
    @Override
    public void run() {
        System.out.println("我是一臺(tái)PRO5");
    }
}
class MX5 implements MeizuPhone{
    @Override
    public void run() {
        System.out.println("我是一臺(tái)MX5");
    }
}
interface IFactory{//抽象的工廠
    MeizuPhone produce();
}
//工廠*2
class BigFactory implements IFactory{
    @Override
    public MeizuPhone produce() {
        return new PRO5();
    }
}
class SmallFactory implements IFactory{
    @Override
    public MeizuPhone produce() {
        return new MX5();
    }
}

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 一、簡(jiǎn)單工廠模式 簡(jiǎn)單工廠模式又稱靜態(tài)工廠方法模式。它存在的目的很簡(jiǎn)單:將對(duì)象的創(chuàng)建過(guò)程封裝進(jìn)一個(gè)類。 先來(lái)看看它...
    innovatorCL閱讀 550評(píng)論 0 1
  • 工廠模式是最常用的一類創(chuàng)建型設(shè)計(jì)模式,之前一直以為工廠模式只是23中設(shè)計(jì)模式中的一種,重新了解才知道這個(gè)模式還要細(xì)...
    晨鳴code閱讀 1,361評(píng)論 0 6
  • 1. 簡(jiǎn)單工廠 簡(jiǎn)單工廠模式又稱為靜態(tài)工廠模式,它屬于創(chuàng)建型模式。在簡(jiǎn)單工廠模式中,可以根據(jù)不同的參數(shù)返回不同類的...
    落英墜露閱讀 262評(píng)論 0 1
  • 在面向?qū)ο缶幊讨? 最通常的方法是一個(gè)new操作符產(chǎn)生一個(gè)對(duì)象實(shí)例,new操作符就是用來(lái)構(gòu)造對(duì)象實(shí)例的。但是在一些...
    聶叼叼閱讀 4,211評(píng)論 2 16
  • 不僅僅是人類,這個(gè)世界上生存的所有動(dòng)物,想要保持健康的一個(gè)絕對(duì)條件,就是讓全身的血液能夠不渾濁、不停滯,并順暢無(wú)阻...
    度人自度閱讀 614評(píng)論 0 1

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