介紹
這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式空执。
在工廠模式中,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象洛波。
優(yōu)點
1、一個調(diào)用者想創(chuàng)建一個對象骚露,只要知道其名稱就可以了蹬挤。
2、擴展性高棘幸,如果想增加一個產(chǎn)品焰扳,只要擴展一個工廠類就可以。
3误续、屏蔽產(chǎn)品的具體實現(xiàn)吨悍,調(diào)用者只關(guān)心產(chǎn)品的接口。
缺點
每次增加一個產(chǎn)品時蹋嵌,都需要增加一個具體類和對象實現(xiàn)工廠育瓜,使得系統(tǒng)中類的個數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復雜度栽烂,同時也增加了系統(tǒng)具體類的依賴爆雹。這并不是什么好事。
注意
作為一種創(chuàng)建類模式愕鼓,在任何需要生成復雜對象的地方,都可以使用工廠方法模式慧起。有一點需要注意的地方就是復雜對象適合使用工廠模式菇晃,而簡單對象,特別是只需要通過 new 就可以完成創(chuàng)建的對象蚓挤,無需使用工廠模式磺送。如果使用工廠模式,就需要引入一個工廠類灿意,會增加系統(tǒng)的復雜度估灿。
代碼實現(xiàn)(php)
<?php
/**
* 簡單工廠
* User: ningsiy
*/
/**
* 定義電腦接口
* Interface Computer
*/
interface Computer
{
public function createComputer();
}
/**
* Class Dell
* 實現(xiàn)電腦接口 (戴爾電腦制造商)
*/
class Dell implements Computer
{
public function createComputer()
{
echo '戴爾筆記本<br/>';
}
}
/**
* Class Asus
* 實現(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();
運行結(jié)果
python實現(xiàn)
# 簡單工廠 ningsiy
class Php:
def __init__(self, lan):
self.lan = lan
def say(self):
return self.lan + ' 實現(xiàn)簡單工廠模式。'
class Java:
def __init__(self, lan):
self.lan = lan
def say(self):
return self.lan + ' 實現(xiàn)簡單工廠模式缤剧。'
class Python:
def __init__(self, lan):
self.lan = lan
def say(self):
return self.lan + ' 實現(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()