简单工厂加反射是OCP原则的很好体现。网上已经有不少的例子了,可是这种东西,只有本身想出一个例子,才算是本身的。java
下面的代码中一个五个类。ide
TestSimpleFactory是用来测试的驱动。 测试
IAnimal是一个接口,声明了一个动物类的行走go的方法。spa
Chicken实现了IAnimal接口,表示小鸡,Chicken实现go。只是简单输出Chicken Run。小鸡的走的方式是奔跑。对象
Duck也实现了IAnimal接口,表示小鸭,Duck实现go。只是简单输出Duck。小鸭的走的方式是游泳。blog
AnimalFactory是一个简单工厂,用来生产小鸡或小鸭。接口
TestSimpleFactory.javaget
public class TestSimpleFactory { string
public static void main(String[] args) {
- PropertyReader reader=new PropertyReader("factory.properties");
- String type=reader.getProperty("factory");
- IAnimal animal=AnimalFactory.createAnimal(type);
- animal.go();
- }
- }
IAnimal.javait
- public interface IAnimal {
- void go();
- }
Chicken.java
- public class Chicken implements IAnimal{
- public void go() {
- System.out.println("Chicken Run");
- }
- }
Duck.java
- public class Duck implements IAnimal {
- public void go() {
- System.out.println("Duck Swim");
- }
- }
AnimalFactory.java
- public class AnimalFactory {
- public static IAnimal createAnimal(String name)
- {
- try {
- Class c=Class.forName(name);
- return (IAnimal)c.newInstance();
- } catch (ClassNotFoundException e) {
- System.out.println("This class doesn't exsist!");
- e.printStackTrace();
- } catch (InstantiationException e) {
- System.out.println("This class can't be instantiated!");
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
其中具体要建立的对象防止factory.properties中。
动物的子类实例化的时候用到了反射。
factory.properties中的内容为:
- factory=neu.swc.tzy.Car