一、工厂方法模式
为了避免简单工厂模式的缺点,不完全满足OCP。工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
1.1 车接口
package edu.aeon.model.factory.factorymethod;
/**
* [说明]:车类型接口
* @author aeon(qq:1584875179)
*/
public interface Car {
void run();
}
1.2宝马类
package edu.aeon.model.factory.factorymethod;
/**
* [说明]:宝马类
* @author aeon(qq:1584875179)
*
*/
public class BMW implements Car {
@Override
public void run() {
System.out.println("宝马在跑!");
}
}
1.3比亚迪类
package edu.aeon.model.factory.factorymethod;
/**
* [说明]:比亚迪类
* @author aeon(qq:1584875179)
*
*/
public class Byd implements Car {
@Override
public void run() {
System.out.println("比亚迪在跑!");
}
}
1.4生产车的顶级接口
package edu.aeon.model.factory.factorymethod;
/**
* [说明]:生产车接口
* @author aeon(qq:1584875179)
*
*/
public interface CarFactory {
Car createCar();
}
1.5宝马工厂类
package edu.aeon.model.factory.factorymethod;
/**
* [说明]:生产宝马工厂类
* @author aeon(qq:1584875179)
*
*/
public class BMWFactory implements CarFactory {
@Override
public Car createCar() {
return new BMW();
}
}
1.6 比亚迪工厂类
package edu.aeon.model.factory.factorymethod;
/**
* [说明]:比亚迪工厂类
* @author aeon(qq:1584875179)
*
*/
public class BydFactory implements CarFactory {
@Override
public Car createCar() {
return new Byd();
}
}
1.7 工厂方法模式测试类
package edu.aeon.model.factory.factorymethod;
/**
* [说明]:工厂方法模式测试
* @author aeon(qq:1584875179)
*
*/
public class TestFactoryMethod {
public static void main(String[] args) {
Car car1=new BMWFactory().createCar();
Car car2=new BydFactory().createCar();
car1.run();
car2.run();
}
}
测试结果截图:
这样在以后业务扩展时,我们不需要修改原有代码,通过新添类来实现业务的扩展(增加),完全符合面向对象的程序设计规则(OCP原则),但是相应的曾加了很多类。