目录
一、简单工厂模式
核心思想:有一个专门的类来生产其他类的实例,生产的这些实例有一个共同父类。
举例:假如有一个汽车工厂,它既可以生产宝马汽车,也可以生产奥迪汽车。
代码实现:
// 汽车工厂,有生产汽车的方法
public class CarFactory {
public Car creatCar(int num) {
return num % 2 == 0 ? new BMWCar() : new AudiCar();
}
}
// 汽车接口(获取汽车的生产信息)
public interface Car {
String getCarMode();
}
// 生产宝马汽车
public class BMWCar implements Car{
@Override
public String getCarMode() {
return "华晨宝马 X5";
}
}
// 生产宝马汽车
public class AudiCar implements Car{
@Override
public String getCarMode() {
return "奥迪 A6L旗舰版";
}
}
测试:
@Test
void test() {
Car car = new CarFactory().creatCar(0);
logger.info(car.getCarMode());
}
二、工厂方法模式
核心思想:定义一个专门生产其他类实例的接口,让子类决定具体生产哪个类的实例。工厂方法模式其实是在简单工厂上面做了一些增强。
举例:有一个汽车工厂,它有两个子工厂,分别负责生产各自品牌的汽车。
代码实现:
// 汽车工厂接口
public interface CarFactory {
Car creatCar();
}
// 生产宝马汽车的工厂
public class BMWCarFactory implements CarFactory{
@Override
public Car creatCar() {
return new BMWCar();
}
}
// 生产奥迪汽车的工厂
public class AudiCarFactory implements CarFactory{
@Override
public Car creatCar() {
return new AudiCar();
}
}
// 汽车接口(获取汽车的生产信息),代码与简单工厂相同
// 生产宝马汽车,代码与简单工厂相同
// 生产宝马汽车,代码与简单工厂相同
测试:
@Test
void test() {
// 通过不同的工厂来获取不同实例
Car bmwCar =new BMWCarFactory().creatCar();
logger.info( bmwCar.getCarMode());
Car audiCar =new AudiCarFactory().creatCar();
logger.info( audiCar.getCarMode());
}
三、抽象工厂模式
核心思想:是一种存在产品系的工厂模式,很容易在特定工厂下扩展产品种类。
举例:有一个工厂,它有多个子工厂,各个子工厂可以生产不同种类的产品。
代码实现:
// 统一的工厂接口
public interface Factory {
Car createCar();
Ship createShip();
}
// BMW工厂
public class BMWFactory implements Factory{
@Override
public Car createCar() {
return new BMWCar();
}
@Override
public Ship createShip() {
return new BMWShip();
}
}
// Audi工厂
public class AudiFactory implements Factory{
@Override
public Car createCar() {
return new AudiCar();
}
@Override
public Ship createShip() {
return new AudiShip();
}
}
// 汽车接口(获取轮船的生产信息),代码与简单工厂相同
// 宝马汽车产品,代码与简单工厂相同
// 奥迪汽车产品,代码与简单工厂相同
// 轮船接口(获取轮船的生产信息)
public interface Ship {
String getShipMode();
}
// 宝马轮船产品
public class BMWShip implements Ship{
@Override
public String getShipMode() {
return "宝马 造轮船了~";
}
}
// 奥迪的轮船产品
public class AudiShip implements Ship{
@Override
public String getShipMode() {
return "奥迪 造轮船了~";
}
}
测试:
@Test
void test() {
// 宝马工厂生产汽车和轮船
logger.info(new BMWFactory().createCar().getCarMode());
logger.info(new BMWFactory().createShip().getShipMode());
// 奥迪工厂生产汽车和轮船
logger.info(new AudiFactory().createCar().getCarMode());
logger.info(new AudiFactory().createShip().getShipMode());
小结:
(1)增加xx工厂:创建xx工厂,继承工厂接口,然后创建xx汽车继承汽车接口,创建xx轮船继承轮船接口即可。
(2)增加飞机产品:首先创建飞机接口,然后分别创建BMW飞机和Audi飞机实现类实现飞机接口。然后再工厂接口中增加创建飞机的方法,在BMW工厂和Audi工厂分别实现自家飞机的创建。