工厂方法模式(由子类决定要创建的具体类是哪一个)

源码地址 https://github.com/DingMouRen/DesignPattern
工厂方法模式(由子类决定要创建的具体类是哪一个)_第1张图片
工厂方法模式.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 createBike(Class clz);
}
//具体工厂类
public class BikeFactory extends Factory{
    @Override
    public  T createBike(Class 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();

    }
总结

我们为工厂方法模式添加新的产品时需要编写新的产品类,同时也要编写相应的抽象层,会造成类结构复杂化。所以要权衡是否要使用工厂方法模式。

你可能感兴趣的:(工厂方法模式(由子类决定要创建的具体类是哪一个))