【图解设计模式系列】The Factory Method Pattern: 工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到了其子类。
看着定义 意思就是说 接口-子类模式就是属于这种模式,就是说要尽可能的多建立接口,而不是建立实体类让子类继承。
英文解释:
encapsulates object creation by letting subclasses decide what objects to create
defines an interface for creating an object, but lets subclasses decide which class to instantiate. Factory method lets a class defer instantiation to subclasses.


如果上面的图看起来有一些杂乱,那么看下面这张图:

工厂方法模式包含以下几个角色:
抽象产品角色(Product):具体产品对象的共同父类或共同拥有的接口。
具体产品角色(ConcreateProduct):实现抽象产品接口的具体产品类,包含产品的具体细节。
抽象工厂角色(Factory):是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。
具体工厂角色(ConcreateFactory):实现抽象工厂接口的具体工厂类,用于创建具体产品对象。
和静态工厂模式有什么不同?
**在静态工厂方法中,静态工厂负责创建所有的产品。**而在工厂方法模式中,通过类图可知,每个产品都由一个对应的工厂创建。
实例
通过汽车工厂生产汽车来说明工厂方法模式的应用。
汽车(抽象产品)
/**
* 抽象产品
*/
public interface Car {
void showSlogan();
}
具体的汽车
/**
* 奥迪车(具体产品)
*/
public class AudiCar implements Car {
@Override
public void showSlogan() {
System.out.println("伟大,不是成就,而是经历。奥迪Q7!");
}
}
/**
* 奔驰车(具体产品)
*/
public class BenZCar implements Car {
@Override
public void showSlogan() {
System.out.println("全新梅赛德斯-奔驰GLE SUV,万千气象,纵横无疆。");
}
}
/**
* 宝马车(具体产品)
*/
public class BMWCar implements Car {
@Override
public void showSlogan() {
System.out.println("便捷畅享BMW之悦,让纯粹驾驶乐趣.时刻在您身边");
}
}
汽车工厂(抽象工厂)
/**
* 汽车工厂(抽象工厂)
*/
public interface CarFactory {
Car ProduceCar();
}
具体的工厂
/**
* 奥迪工厂,生产奥迪车
*/
public class AudiCarFactory implements CarFactory {
@Override
public Car ProduceCar() {
return new AudiCar();
}
}
/**
* 奔驰工厂,生产奔驰车
*/
public class BenZCarFactory implements CarFactory {
@Override
public Car ProduceCar() {
return new BenZCar();
}
}
/**
* 宝马工厂,生产宝马车
*/
public class BMWCarFactory implements CarFactory {
@Override
public Car ProduceCar() {
return new BMWCar();
}
}
public class Client {
public static void main(String[] args) {
//奔驰车工厂,生产奔驰车
CarFactory benzCarFactory = new BenZCarFactory();
Car benzCar = benzCarFactory.ProduceCar();
benzCar.showSlogan();
//宝马车工厂,生产宝马车
CarFactory bmwCarFactory = new BMWCarFactory();
Car bmwCar = bmwCarFactory.ProduceCar();
bmwCar.showSlogan();
//奥迪车工厂,生产奥迪车
CarFactory audiCarFactory = new AudiCarFactory();
Car audiCar = audiCarFactory.ProduceCar();
audiCar.showSlogan();
}
}
优缺点
优点:
1.与简单工厂模式相比,工厂方法模式减轻了工厂类的负担**,把某一类产品交由一个工厂生产,不同的工厂生产不同类别的产品。**
2.遵守了开闭原则。增加某一类产品时并不需要修改工厂类,只需要添加生产这类产品的工厂即可。
缺点:
随着产品种类的数量的增长,工厂类也会随之增加,将不利于系统的维护。

浙公网安备 33010602011771号