工厂模式及使用反射实现工厂模式

来源:互联网 发布:icc 文件 mac 编辑:程序博客网 时间:2024/05/17 23:42
一、工厂模式
1,概念
工厂模式(Factory Pattern)即在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式是Java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,它提供了一种创建爱你对象的最佳方式。
2,目的
定义一个创建对象的接口,让其自雷自己决定实例化那一个工厂类,工厂模式使其创建过程延迟到自雷进行。
3,优缺点
优点:一个调用者想创建一个对象,只要知道其名称就可以了。扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以了。屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每增加一个产品,都需要增加一个具体类和对象实现工厂,似的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同事也增加了系统具体类的依赖。
4,使用场景:日志记录,数据库访问,通用协议等。
二、实现步骤及反射优化
步骤1:创建一个接口
public interface Animal {
public void eat();
}
步骤二:创建实现接口的实体类。
public class Peoples implements Animal {

@Override
public void eat() {
System.out.println("People eat with chopsticks");
}
}

public class Panda implements Animal {

@Override
public void eat() {
System.out.println("Pandas eat bamboo");
}
}

步骤3:创建一个工厂,生成基于给定信息的实体类的对象。
原始类
public class AnimalFactor {
public Animal getAnimal(String animalType) {
if(animalType == null) {
return null;
}
if("PEOPLES".equals(animalType)) {
return new Peoples();
} else if("Panda".equals(animalType)) {
return new Panda();
}

}
}
反射优化
public class AnimalFactor {
public static Object getClass(Class<?extends Animal> clazz) {
Object obj = null;
try {
obj = Class.forName(clazz.getName()).newInstance();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return obj;
}
}
步骤4:使用该工厂,通过传递类型信息来获取实体类的对象。
public class FactorDemo {
public static void main(String[] args) {
AnimalFactory animalFactory = new AnimalFactory();
Animal animal1 = animalFactory.getAnimal("PEOPLES");
animal1.eat();
Animal animal2 = animalFactory.getAnimal("PANDA");
animal2.eat();
}
}
反射实现
Peoples peoples = (Peoples) AnimalFactory.getClass(Peoples.class);
peoples .eat();
原创粉丝点击