我想养1些小动物,把他们圈养在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中要进行4次实例化,如果我开个动物园,实例化的语句怎样办呢?总不能有多少动物就写多少动物吧。如果我圈养10几只动物,每天豢养他们,毫无疑问上述的客户端会变得杂乱不堪。
这样就引出了简单工厂模式。
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....
}
}
通过简单工厂模式,我可以圈养大批动物,在开饭的时候可以1起喂食,睡觉的时候可以1起要求睡觉等等。
这就是简单工厂模式,让类似的对象来自于同1个抽象的东西,通过工厂类,生产这些对象,而在操作这些对象的时候又可使用它们的父类统1操作。固然,生产甚么样的对象还是需要客户端来决定。
不足的地方在于,每增加1个新的物种,都需要修改AnimalFactory这个工厂类,修改switch选择语句,要解决这个问题,就需要通过抽象工厂来解决了,详见工厂模式.