1、介绍
工厂方法模式定义了一个用于创建对象的接口,让子类决定实例化相应的类,即使类的实例化推迟到子类中。
2、实现
工厂方法模式有子类与超类,其中超类可以是接口、抽象类、父类。根据不同参数类型返回一个Product子类对象。
2.1、产品类
首先定义两个不同的子类,每一个子类继承Product超类
public class Product1 extends Product {
@Override
public void play() {
……
}
}
public class Product2 extends Product {
@Override
public void play() {
……
}
}
2.2、工厂类
定义了超类和子类后,定义相应的工厂类,工厂类根据不同的参数返回不同的产品类 简单工厂模式方法与工厂模式方法的工厂类不同,前者传入参数根据参数创建不同的类,后者传入类。
简单工厂模式的工厂类
public class Factory {
public Product create(String type){
Product product = null;
switch(type){
case "Product1":{
product=new Product1();
break;
}
case "Product2":{
product=new Product2();
break;
}
}
reutrn product;
}
}
工厂模式的工厂类
public class Factory {
public <T extends Product> T create(Class<T> clazz){
Product product = null;
String className=clazz.getName();
try{
product=(Product) Class.forName(className).newInstance();
}catch(EXception e){
e.printStacktrace();
}
reutrn (T) product;
}
}
- 工厂类可以是单例模式,获取产品类实例的方法是静态方法。
- 工厂类根据不同的参数返回不同的产品类。
客户端调用
Product2 product2=Factory.create(Product2.class);
product2.play();
3、简单工厂模式和工厂模式的比较
简单工厂模式
- 根据参数获取对应实例
- 能够创建的类在编译时已经确定,如果需要增加则要修改工厂类
- 当子类过多时不适用
工厂模式
- 根据反射创建相应的实例
- 能够灵活增加类,而无需修改工厂类