1.定义
一定一个创建对象的接口,让子类决定实例化哪个类。
2.使用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。
3.简单实现
以一个汽车组装为例,汽车厂主要以组装一款SUV车型,比如Q3、Q5、Q7,对于这类车型内部差异并不大,除了基本功能以外,还提供了自动巡航,无人驾驶之类的功能。
//产品的抽象类 abstract class Car{ //汽车行驶的方法 public abstract void drive(); //自动巡航的方法 public abstract void selfNavigation(); } //Q3车型 class Q3 extends Car{ @Override public void drive() { System.out.println("Q3 启动"); } @Override public void selfNavigation() { System.out.println("Q3 自动巡航"); } } //Q5车型 class Q5 extends Car{ @Override public void drive() { System.out.println("Q5 启动"); } @Override public void selfNavigation() { System.out.println("Q5 自动巡航"); } } //Q7车型 class Q7 extends Car{ @Override public void drive() { System.out.println("Q7 启动"); } @Override public void selfNavigation() { System.out.println("Q5 自动巡航"); } } //抽象工厂 abstract class CarFactory{ //T 对应具体型号 abstract <T extends Car> T createCat(Class<T> clz); } //具体的汽车生产线 class MyCarFactory extends CarFactory{ @Override <T extends Car> T createCat(Class<T> clz) { Car car = null; try { car =(Car) Class.forName(clz.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T)car; } } public class FactoryMode { public static void main(String[] arg){ //创建汽车制造的工厂对象 MyCarFactory factory = new MyCarFactory(); //生产Q3 Q3 q3 = factory.createCat(Q3.class); q3.drive(); q3.selfNavigation(); //生产Q5 Q5 q5 = factory.createCat(Q5.class); q5.drive(); q5.selfNavigation(); //生产Q7 Q7 q7 = factory.createCat(Q7.class); q7.drive(); q7.selfNavigation(); } }
4.小结
优点:降低了对象的耦合度,而且工厂模式是依赖于抽象的架构,实现交由子类去完成,具有很好的拓展性。
缺点:每次添加一个产品就要添加一个产品类,还要引入抽象层,导致类的结构复杂化。