简单工厂模式是java 设计模式里头比较简单基础的一种,其特点是根据用户不同的参数而返回不同的实例。
使用简单工厂的好处在于在今后可能的系统扩展或修改时带来更大的可扩展行和更少的代码修改。
根据《重构》 中的介绍,尽量减少 生成新的对象的代码。
在这里,我自己写了一个简单工厂的小例子:
/** * 这是一个动物类,有一个所有动物都有的方法 shout * @author liaogang.pt */ public class Animal { public void shout(){ System.out.println("you create a :"+this.getClass().getName()); } }
/** * 这是一个熊类,简单起见,它继承了 Animal 类,同时也就继承了shout 方法 * @author liaogang.pt * */ public class Bear extends Animal{ }
/** * 这是一个猫类,简单起见,它继承了 Animal 类,同时也就继承了shout 方法 * @author liaogang.pt */ public class Cat extends Animal{ } /** * 这是一个狗类,简单起见,它继承了 Animal 类,同时也就继承了shout 方法 * @author liaogang.pt * */ public class Dog extends Animal{ } /** * 这是动物工厂类,它的作用就是根据用户输入的字符来生产一个对应的 猫/狗/熊 类 * @author liaogang.pt * */ public class AnimalFactory { public static Animal createAnimal(char type){ Animal animal = null; switch(type){ case 'd' : animal=new Dog(); break; case 'c' : animal=new Cat(); break; case 'b' : animal=new Bear(); break; } return animal; } }
/** * 这是一个带main 方法的演示类,用来显示使用 AnimalFactory 类产生不同的动物实例 * @author liaogang.pt * */ public class TestAnimalFactory { public static void main(String[] args){ Animal animal1= AnimalFactory.createAnimal('b'); Animal animal2= AnimalFactory.createAnimal('c'); Animal animal3= AnimalFactory.createAnimal('d'); animal1.shout(); animal2.shout(); animal3.shout(); } }
最后输出结果:you create a :Bear you create a :Cat you create a :Dog
在这个例子中,先声明了一个animal 父类,animal 类中还有一个 shout 方法,其中:
System.out.println("you create a :"+this.getClass().getName());
的作用就是打印出调用 shout 方法的animal 类或其子类的类名
通过这样的方式,我们在使用 工厂方法生产的 animal 子类就可以明确到底是产生了那个子类了。
看看 AnimalFactory 工厂方法,我还顺带着用了一下多态,啥叫多态 : 声明了父类,产生的却是某个子类。
用 Animal animal =null 来声明一个 父类,
animal = new Dog () 产生一个 DOG 子类
PS:为了保证代码的健壮性,也为了向程序阅读者强调 AnimalFactory 仅仅只是一个工厂类,是用来产生 Animal 的子类对象的,
可以 将 AnimalFactory 的默认构造函数设置为private ,这样即使他人想实例化 AnimalFactory 这个工厂类,也无能为力。
修改后的工厂类方法:
/** * 这是动物工厂类,它的作用就是根据用户输入的字符来生产一个对应的 猫/狗/熊 类 * 使用私有默认构造函数,进一步表明这个类是一个工厂类,不能作为他用 * @author liaogang.pt * */ public class AnimalFactory { private AnimalFactory(){ }; public static Animal createAnimal(char type){ Animal animal = null; switch(type){ case 'd' : animal=new Dog(); break; case 'c' : animal=new Cat(); break; case 'b' : animal=new Bear(); break; } return animal; } }