设计模式之工厂方法模式

写在前面

本文看下工厂方法设计模式。

1:介绍

1.1:什么时候用工厂方法

当我们有若干个种类的对象需要创建,且随着业务的发展,要创建的对象的种类还会不断变化,此时可以考虑使用工厂方法设计模式。

1.2:UML类图

工厂方法设计模式,包含如下元素:

1:抽象工厂类
    工厂类的抽象,定义一个用于生产对象的方法。
2:具体工厂类
    继承抽象工厂类,用于生产具体的某项类型的对象(产品)。
3:产品类
    需要被创建的类。
4:客户端
    客户端根据需要使用对应的具体工厂类来创建具体的产品(对象)。

如下图:

设计模式之工厂方法模式_第1张图片

2:实例

源码 。

2.1:场景

分别需要生产自行车,汽车,飞机,这三类产品。

2.2:程序

  • 定义3个具体产品类(包括接口的话4个)
public interface Vehicle {

    void sayHi();
}

public class Plane implements Vehicle {
    @Override
    public void sayHi() {
        System.out.println("hi from " + this.getClass().getSimpleName());
    }
}

public class Car implements Vehicle {

    @Override
    public void sayHi() {
        System.out.println("hi from " + this.getClass().getSimpleName());
    }
}

public class Bicycle implements Vehicle {
    @Override
    public void sayHi() {
        System.out.println("hi from " + this.getClass().getSimpleName());
    }
}
  • 定义抽象工厂类
public abstract class AbstractVehicleFactory<T> {

//    abstract  T makeProduct();
    public abstract T makeProduct();
}
  • 定义自行车工厂类
public class BicycleFactory extends AbstractVehicleFactory<Bicycle> {
    @Override
    public Bicycle makeProduct() {
        return new Bicycle();
    }
}
  • 定义汽车工厂类
public class CarFactory extends AbstractVehicleFactory {

    @Override
    public Car makeProduct() {
        return new Car();
    }
}
  • 定义飞机工厂类
public class PlaneFactory extends AbstractVehicleFactory<Plane> {
    @Override
    public Plane makeProduct() {
        return new Plane();
    }
}

2.3:测试

public class FactoryTest {
    public static void main(String[] args) {
        // 生产自行车
        AbstractVehicleFactory<Bicycle> bicycleAbstractVehicleFactory = new BicycleFactory();
        bicycleAbstractVehicleFactory.makeProduct().sayHi();
        // 生产汽车
        AbstractVehicleFactory<Car> carAbstractVehicleFactory = new CarFactory();
        carAbstractVehicleFactory.makeProduct().sayHi();
        // 生产飞机
        AbstractVehicleFactory<Plane> planeAbstractVehicleFactory = new PlaneFactory();
        planeAbstractVehicleFactory.makeProduct().sayHi();
    }
}

运行:

hi from Bicycle
hi from Car
hi from Plane

Process finished with exit code 0

这样当有新的产品时,只需要提供对应的工厂类即可。另外,当我们需要创建的不是一个产品,而是一组需要系统工作的产品时,工厂方法就不行了,需要考虑抽象工厂设计模式。

写在后面

参考文章列表

简单工厂模式、工厂方法模式与抽象工厂模式总结 。

你可能感兴趣的:(设计模式,设计模式,工厂方法模式)