二、 Factory Method(工厂方法模式)
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使一个类的实例化延迟到了子类。
了解工厂方法模式,要从工厂模式说起,工厂模式可以分为三类:
(1)简单工厂模式(Simple Factory)
(2)工厂方法模式(Factory Method)
(3)抽象工厂模式(Abstract Factory)
而有的书上将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。
在还没有工厂的时代,如果一个客户要一款宝马车,客户就会自己去制造一辆:
产品类:
// BMWX5.java
public class BMWX5 {
publicBMWX5(){
System.out.println("制造一辆宝马X5");
}
}
// BMWX6.java
public class BMWX6 {
publicBMWX6(){
System.out.println("制造一辆宝马X6");
}
}
客户类:
// Comsumer.java
public class Comsumer {
publicstatic void main(String[] args) {
BMWX5x5 = new BMWX5();
BMWX6x6 = new BMWX6();
}
}
后来出现了工业革命,客户不用亲自去制造汽车了,因为客户开了一个制造汽车的工厂,想要什么样的车,这个工厂可以制造。
产品类:
// BMW.java
public abstract class BMW {
publicBMW(){
}
}
// BMWX5.java
public class BMWX5 extends BMW {
publicBMWX5() {
System.out.println("制造一辆宝马X5");
}
}
// BMWX6.java
public class BMWX6 extends BMW{
publicBMWX6(){
System.out.println("制造一辆宝马X6");
}
}
工厂类:
// Factory.java
public class Factory {
publicstatic BMW createBMW(String type) {
if(type== "X5")
returnnew BMWX5();
elseif(type == "X6")
returnnew BMWX6();
elsereturn null;
}
}
客户类:
// Customer.java
public class Customer {
publicstatic void main(String[] args) {
Factoryfactory = new Factory();
BMWx5 = factory.createBMW("X5");
BMWx6 = factory.createBMW("X6");
}
}
宝马车系列越来越多,如320i、523i、30li等系列,一个工厂已经无法创建所有的宝马车系列。于是又单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。
产品类:
// BMW.java
public abstract class BMW {
publicBMW(){
}
}
// BMWX5.java
public class BMWX5 extends BMW {
publicBMWX5() {
System.out.println("制造一辆宝马X5");
}
}
// BMWX6.java
public class BMWX6 extends BMW{
publicBMWX6(){
System.out.println("制造一辆宝马X6");
}
}
工厂类:
// FactoryBMW.java
public interface FactoryBMW {
BMWcreateBMW();
}
// FactoryBMWX5.java
public class FactoryBMWX5implements FactoryBMW{
publicBMWX5 createBMW() {
returnnew BMWX5();
}
}
// FactoryBMWX6.java
public class FactoryBMWX6 implements FactoryBMW{
publicBMWX6 createBMW() {
returnnew BMWX6();
}
}
客户类:
// Customer.java
public class Customer {
publicstatic void main(String[] args) {
FactoryBMWX5factoryBMWX5 = new FactoryBMWX5();
BMWX5x5 = factoryBMWX5.createBMW();
FactoryBMWX6factoryBMWX6 = new FactoryBMWX6();
BMWX6x6 = factoryBMWX6.createBMW();
}
}