工厂方法模式(由子类决定要创建的具体类是哪一个)
2017-11-16 本文已影响10人
钉某人
| 源码地址 | https://github.com/DingMouRen/DesignPattern |
|---|
工厂方法模式.png
- Product定义工厂方法所创建的对象的接口
- ConcreteProduct实现Product的接口
- Factory声明工厂方法,该方法返回一个Product类型的对象,也可以定义一个工厂的默认实现,返回一个默认实现的ConcreteProduct对象。依赖子类ConcreteFactory来定义工厂方法
- ConcreteFactory重新定义工厂方法来返回一个ConreteProduct对象
定义
工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。
使用场景
- 需要生成复杂对象的地方
- 当一个类希望由它的子类来指定它所创建的对象的时候。
协作
Factory依赖它的子类来定义工厂方法createProduct(),工厂方法返回恰当的产品对象即可。
举个栗子
我们要生产两种自行车:一般自行车和山地车,组装过程基本都是相同的。
//抽象产品类:自行车
public abstract class Bike {
public abstract void drive();
}
//具体产品类:一般的自行车
public class GeneralBike extends Bike {
@Override
public void drive() {
System.out.println(this.getClass().getSimpleName()+"可以骑了");
}
}
//抽象工厂类
public abstract class Factory {
public abstract <T extends Bike> T createBike(Class<T> clz);
}
//具体工厂类
public class BikeFactory extends Factory{
@Override
public <T extends Bike> T createBike(Class<T> clz) {
Bike bike = null;
try {
bike = (Bike) Class.forName(clz.getName()).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return (T) bike;
}
}
使用
public static void main(String[] args) {
//创建工厂对象
Factory factory = new BikeFactory();
//创建自行车
Bike generalBike = factory.createBike(GeneralBike.class);
Bike mountainBike = factory.createBike(MountainBike.class);
//自行车试驾
generalBike.drive();
mountainBike.drive();
}
总结
我们为工厂方法模式添加新的产品时需要编写新的产品类,同时也要编写相应的抽象层,会造成类结构复杂化。所以要权衡是否要使用工厂方法模式。