工厂方法模式是常见的设计模式,属于创建型模式。它的核心在于封装类中不变的部分,定义一个用户创建对象的接口,让子类决定实现哪一个类。工厂方法模式使一个类的实例化延迟到其子类。
使用场景:由客户端决定需要在哪一个工厂子类来实现产品类。进而在需求增加或改变时可以在增加满足需求的工厂或产品类后,只修改客户端代码。
优点:封装性强,降低了耦合度,易于扩展。
角色结构:抽象工厂,具体工厂,抽象产品,具体产品
使用场景:现有一汽车生产厂商,可以根据客户的需求,来生产各类汽车。收到订单时直接将订单发往对应的生产子工厂进行生产。
1.抽象工厂实现:
package com.create.factorypatterm.factorymethod;
/**
* 抽象工厂
* @author LIUZENGLONG
*
*/
public interface Factory {
public Car createCar();
}
2.具体工厂实现:
package com.create.factorypatterm.factorymethod;
/**
* 具体工厂,生产奥迪车的子工厂
* @author LIUZENGLONG
*
*/
public class AudiFactory implements Factory {
@Override
public Car createCar() {
return new Audi();
}
}
package com.create.factorypatterm.factorymethod;
/**
* 具体工厂,生产奔驰车的子工厂
* @author LIUZENGLONG
*
*/
public class BenzFactory implements Factory {
@Override
public Car createCar() {
return new Benz();
}
}
3.抽象产品的实现:
package com.create.factorypatterm.factorymethod;
/**
* 抽象产品
* @author LIUZENGLONG
*
*/
public interface Car {
public void create();
}
4.具体产品的实现:
package com.create.factorypatterm.factorymethod;
/**
* 具体产品,奥迪车
* @author LIUZENGLONG
*
*/
public class Audi implements Car {
@Override
public void create() {
System.out.println("生产奥迪汽车");
}
}
package com.create.factorypatterm.factorymethod;
/**
* 具体产品,奔驰车
* @author LIUZENGLONG
*
*/
public class Benz implements Car {
@Override
public void create() {
System.out.println("生产奔驰汽车");
}
}
5.客户端,测试
package com.create.factorypatterm.factorymethod;
/**
* 客户端,生产一辆奥迪车
* @author LIUZENGLONG
*
*/
public class FactoryTest {
public static void main(String[] args) {
Car car = new AudiFactory().createCar();
car.create();
}
}
6.需求扩展
某一天,因为业务扩展原因。需要生产宝马车。根据设计模式的开闭原则,我们不应该直接修改原来的程序。根据工厂方法模式的原理,我们只需创建新的工厂类和产品类,然后在客户端进行实现即可。
package com.create.factorypatterm.factorymethod;
/**
* 具体工厂,新的工厂,生产宝马汽车
* @author LIUZENGLONG
*
*/
public class BmwFactory implements Factory {
@Override
public Car createCar() {
return new Bmw();
}
}
/**
* 新的产品,宝马汽车
* @author LIUZENGLONG
*
*/
public class Bmw implements Car {
@Override
public void create() {
System.out.println("生产宝马汽车");
}
}
客户端实现新的需求:
public class FactoryTest {
public static void main(String[] args) {
Car car = new BmwFactory().createCar();
car.create();
}
}