介紹
這種類型的設(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()