java23种设计模式之八: 工厂方法模式
定义:
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,
它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”。
优点:
用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点:
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
结构:
抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 createProduct() 来创建产品。
具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
总述:
对于工厂方法其实就是让工厂生产产品,只不过我们把这个向上提取一下,我们以汽车为例,汽车厂肯定是生产汽车的,但是不同的汽车厂生产的汽车和型号不同,那我们就可以把这个工厂抽象一下,汽车工厂都是生产汽车的,具体哪一种车我们不知道,因此,我们把抽象工厂生产出来的车也是抽象的车,都拥有可以在路上跑的功能。然后,我们该造具体的车了,很简单,我们把具体的汽车品牌实现抽象出来的车就可以,因为具体的车也拥有在路上跑的功能,那这个车可以是奥迪、宝马、奔马等等。既然有了具体的汽车品牌,那我们可以让具体的工厂来造车,因此我们可以让奥迪汽车厂专门造奥迪,宝马专门造宝马,那么我们让具体的工厂实现之前抽象出来的工厂,这样,我们就可以让自家的汽车车生产自家的汽车。
其实就是:具体的工厂生产具体的产品,让调用者无须参与创建过程。
就像你买车一样,你会找到自己看中的品牌、车型,买下即可,但你不会参与整个生产过程一样
//抽象工厂
public interface AbstractFactory { AbstractProductCar createProducet(); } //抽象产品 public interface AbstractProductCar { void run(); } //具体产品 public class AudiCar implements AbstractProductCar{ @Override public void run() { System.out.println("奥迪车在路上跑。。。。。。"); } } //具体产品 public class BMWCar implements AbstractProductCar{ @Override public void run() { System.out.println("宝马车在路上跑。。。。。。"); } } //具体工厂 public class AudiCarFactory implements AbstractFactory{ @Override public AbstractProductCar createProducet() { return new AudiCar(); } } //具体工厂 public class BMWCarFactory implements AbstractFactory{ @Override public AbstractProductCar createProducet() { return new BMWCar(); } } //测试类 public class MainTest { public static void main(String[] args) { AbstractFactory bmwFactory = new BMWCarFactory(); bmwFactory.createProducet().run(); AbstractFactory audi = new AudiCarFactory(); audi.createProducet().run(); } }