一、概述
定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。
二、适用性
1.当一个类不知道它所必须创建的对象的类的时候。
2.当一个类希望由它的子类来指定它所创建的对象的时候。
3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
三、参与者
Factory:抽象工厂,其为工厂方法模式的核心;
ConcreteFactory:具体工厂,其实现了具体的业务逻辑;
Product:抽象产品,是工厂方法模式所创建的产品的父类;
ConcreteProduct:具体产品,为实现抽象产品的某个具体产品的对象。
四、UML类图
五、代码示例
抽象产品类:
package com.trs.designpattern.factorymethod;
public interface PorscheCar {
public void run();
}
具体产品类:
package com.trs.designpattern.factorymethod;
public class Porsche911 implements PorscheCar {
public void run() {
System.out.println("保时捷911开始启动......");
}
}
package com.trs.designpattern.factorymethod;
public class Porsche918 implements PorscheCar{
public void run() {
System.out.println("保时捷918开始启动......");
}
}
抽象工厂类:
package com.trs.designpattern.factorymethod;
public interface PorscheCarFactory {
PorscheCar createPorscheCar();
}
具体工厂类:
package com.trs.designpattern.factorymethod;
public class Porsche911Factory implements PorscheCarFactory {
@Override
public PorscheCar createPorscheCar() {
return new Porsche911() ;
}
}
package com.trs.designpattern.factorymethod;
public class Porsche918Factory implements PorscheCarFactory {
@Override
public PorscheCar createPorscheCar() {
return new Porsche918();
}
}
客户端程序:
package com.trs.designpattern.factorymethod;
public class Customer {
public static void main(String[] args) {
//生产一辆保时捷911并启动
PorscheCarFactory factory1 = new Porsche911Factory();
PorscheCar car1 = factory1.createPorscheCar();
car1.run();
//生产一辆保时捷918并启动
PorscheCarFactory factory2 = new Porsche918Factory();
PorscheCar car2 = factory2.createPorscheCar();
car2.run();
}
}
运行结果:
参考设计模式博客:https://blog.youkuaiyun.com/LoveLion/article/details/8624325