我想養(yǎng)1些小動物,把他們?nèi)︷B(yǎng)在1起看著他們長大,我選擇貓,狗,羊,雞這4種動物。
1般思想,不過建立4個動物類,實例化便可,以下:
class Dog{
public void shout(){
System.out.prinltn("dog shout");
}
}
class Cat{
public void shout(){
System.out.prinltn("cat shout");
}
}
class Chicken{
public void shout(){
System.out.prinltn("chicken shout");
}
}
class Goat{
public void shout(){
System.out.prinltn("goat shout");
}
}
public static void main(String[] args){
Dog dog = new Dog();
Cat cat = new Cat();
Goat goat = new Goat();
Chicken chicken = new Chicken();
}
如上面這個寫法,4個動物已很麻煩,在客戶端main中要進(jìn)行4次實例化,如果我開個動物園,實例化的語句怎樣辦呢?總不能有多少動物就寫多少動物吧。如果我圈養(yǎng)10幾只動物,每天豢養(yǎng)他們,毫無疑問上述的客戶端會變得雜亂不堪。
這樣就引出了簡單工廠模式。
interface Animale{
public abstract void shout();
}
class Goat implements Animale{
@Override
public void shout() {
System.out.println("goat shout");
}
}
class Chicken implements Animale{
@Override
public void shout() {
System.out.println("chicken shout");
}
}
class Dog implements Animale{
@Override
public void shout() {
System.out.println("dog shout");
}
}
class Cat implements Animale{
@Override
public void shout() {
System.out.println("cat shout");
}
}
class AnimalFactory{
public static Animale getAnimale(int kind){
Animale animale = null;
switch(kind){
case 0:
animale = new Dog();
break;
case 1:
animale = new Cat();
break;
default:
animale = null;
}
return animale;
}
}
因此客戶端可以這樣處理這么1大群動物:
public static void main(String[] args){
List<Animale> zoo = new ArrayList<Animale>();
for(int i=0;i<4;i++)
zoo.add(AnimalFactory.getAnimale(0));
for(int i=0;i<2;i++)
zoo.add(AnimalFactory.getAnimale(1));
for(int i=0;i<4;i++)
zoo.add(AnimalFactory.getAnimale(2));
for(int i=0;i<2;i++)
zoo.add(AnimalFactory.getAnimale(3));
for(Animale animale:zoo){
//animale....
}
}
通過簡單工廠模式,我可以圈養(yǎng)大批動物,在開飯的時候可以1起喂食,睡覺的時候可以1起要求睡覺等等。
這就是簡單工廠模式,讓類似的對象來自于同1個抽象的東西,通過工廠類,生產(chǎn)這些對象,而在操作這些對象的時候又可使用它們的父類統(tǒng)1操作。固然,生產(chǎn)甚么樣的對象還是需要客戶端來決定。
不足的地方在于,每增加1個新的物種,都需要修改AnimalFactory這個工廠類,修改switch選擇語句,要解決這個問題,就需要通過抽象工廠來解決了,詳見工廠模式.