工廠模式

介紹

這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。
在工廠模式中,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象。

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

1、一個調(diào)用者想創(chuàng)建一個對象,只要知道其名稱就可以了。
2、擴(kuò)展性高,如果想增加一個產(chǎn)品,只要擴(kuò)展一個工廠類就可以。
3、屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口。

缺點(diǎn)

每次增加一個產(chǎn)品時,都需要增加一個具體類和對象實(shí)現(xiàn)工廠,使得系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時也增加了系統(tǒng)具體類的依賴。這并不是什么好事。

注意

作為一種創(chuàng)建類模式,在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式。有一點(diǎn)需要注意的地方就是復(fù)雜對象適合使用工廠模式,而簡單對象,特別是只需要通過 new 就可以完成創(chuàng)建的對象,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統(tǒng)的復(fù)雜度。

代碼實(shí)現(xiàn)(php)

<?php
/**
 * 簡單工廠
 * User: ningsiy
 */


/**
 * 定義電腦接口
 * Interface Computer
 */
interface Computer
{
    public function createComputer();
}

/**
 * Class Dell
 * 實(shí)現(xiàn)電腦接口 (戴爾電腦制造商)
 */
class Dell implements Computer
{
    public function createComputer()
    {
        echo '戴爾筆記本<br/>';
    }
}

/**
 * Class Asus
 * 實(shí)現(xiàn)電腦接口 (華碩電腦制造商)
 */
class Asus implements Computer
{
    public function createComputer()
    {
        echo '華碩筆記本<br/>';
    }
}

/**
 * Class SimpleFactory
 * 簡單工廠類
 */
class SimpleFactory
{
    public static function buy_dell(){
        return new Dell();
    }

    public static function buy_asus(){
        return new Asus();
    }
}

$dell = SimpleFactory::buy_dell();
$asus = SimpleFactory::buy_asus();
$dell->createComputer();
$asus->createComputer();

運(yùn)行結(jié)果

python實(shí)現(xiàn)

# 簡單工廠  ningsiy


class Php:
    def __init__(self, lan):
        self.lan = lan

    def say(self):
        return self.lan + ' 實(shí)現(xiàn)簡單工廠模式。'


class Java:
    def __init__(self, lan):
        self.lan = lan

    def say(self):
        return self.lan + ' 實(shí)現(xiàn)簡單工廠模式。'


class Python:
    def __init__(self, lan):
        self.lan = lan

    def say(self):
        return self.lan + ' 實(shí)現(xiàn)簡單工廠模式。'


class UnknowLan:
    def say(self):
        return '操作錯誤!'


class Factory:
    def __init__(self, language):
        self.language = language

    def get_say(self):
        if self.language == 'php':
            return Php(self.language)

        elif self.language == 'python':
            return Python(self.language)

        elif self.language == 'java':
            return Java(self.language)

        else:
            return UnknowLan()


def test_fac():
    lan = input('請輸入編程語言:')
    fac = Factory(lan)
    get_say = fac.get_say()
    say = get_say.say()
    print(say)


test_fac()

運(yùn)行結(jié)果

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

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

  • 設(shè)計模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計原則時需要注意以下幾點(diǎn):a) 高內(nèi)聚、低耦合和單一職能的“沖突”實(shí)際上,這兩者...
    彥幀閱讀 3,888評論 0 14
  • 工廠模式是我們最常用的實(shí)例化對象模式了,是用工廠方法代替new操作的一種模式。通常我們所說的工廠模式是指工廠方法模...
    zfylin閱讀 1,403評論 0 7
  • 我受過一些傷在我還小的時候他們不經(jīng)過問撕開我的偽裝于是我穿上更厚的衣裳走過人間荒涼 我那樣堅(jiān)強(qiáng)背著行囊四處流浪他們...
    我的艾達(dá)閱讀 211評論 1 1
  • 記住的部分 3個石匠,養(yǎng)家糊口,數(shù)一數(shù)二,大教堂 中年危機(jī),目標(biāo)喪失,目標(biāo)未達(dá)成放棄 100年后孫子的孫子提起來的...
    一點(diǎn)點(diǎn)先生閱讀 308評論 0 0
  • 1 小卿跟老公結(jié)婚五年了。 五年里充滿了各種爭斗吵鬧。 按照心理學(xué)的說法,老公的原生家庭問題不少,導(dǎo)致他的性格有著...
    唐紫煙閱讀 2,725評論 0 2

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