工厂模式
工厂模式需要了解的一些概念
作用:实现了创建者和调用者的分离
详细分类:
简单工厂模式
工厂方法模式
工厂模式所满足的OOP七大原则:
开闭原则:一个软件的实体应当对扩展开放,对修改关闭
依赖倒转原则:要针对接口编程,不要针对实现编程
迪米特原则:只与你直接的朋友通信,而避免和陌生人通信
工厂模式的核心本质:
实例化对象不使用new,用工厂方法代替
将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
简单工厂模式
此模式中只有一个工厂,可以通过这个工厂生产任意的东西,但是此模式是不满足OOP设计原则中的开闭性原则的,因为当需要 增加一个东西的时候,需要更改原来工厂的代码,具体情况请看下面的解释。
牵涉到的类如下图:
类的结构如下:
//car接口
package factory.simple;
public interface Car {
void name();
}
//特斯拉实现类
package factory.simple;
public class Tesla implements Car {
@Override
public void name(){
System.out.println("特斯拉!");
}
}
//五菱宏光实现类
package factory.simple;
public class WuLing implements Car {
@Override
public void name(){
System.out.println("五菱宏光");
}
}
/*简单工厂模式中只有一个工厂,在这个工厂中可以生产所有的东西,但是简单工厂模式不满足OOP七大原则中的开闭性原则,因为此工厂
中现在只有五菱宏光和特斯拉两种车,如果想要增加一个车辆,那么必须要更改原来的这个工厂,比如说你现在想增加一个大众,那么你
必须要改变此工厂的代码,往其中加上一个大众车辆,所以这样就不满足开闭性原则了*/
package factory.simple;
public class CarFactory {
public static Car getCar(String car){
if(car.equals("五菱")){
return new WuLing();
}else if(car.equals("特斯拉")){
return new Tesla();
}else{
return null;
}
}
}
//消费者类
package factory.simple;
public class Consumer {
public static void main(String[] args) {
//没有工厂模式之前都是用new的方式创建对象
// Car car=new WuLing();
// Car car2=new Tesla();
//2.使用工厂方式获取对象
Car car = CarFactory.getCar("五菱");
Car car2 = CarFactory.getCar("特斯拉");
car.name();
car2.name();
}
}
简单工厂模式的结构图,如下图:
工厂方法模式
工厂方法模式中牵涉到的类如下图:
工厂方法模式中的类的结构如下:
//Car接口
package factory.method;
public interface Car {
void name();
}
//特斯拉实现类
package factory.method;
public class Tesla implements Car {
@Override
public void name(){
System.out.println("特斯拉!");
}
}
//五菱宏光实现类
package factory.method;
public class WuLingFactory implements CarFactory {
@Override
public Car getCar(){
return new WuLing();
}
}
//汽车工厂接口CarFactory
package factory.method;
public interface CarFactory {
Car getCar();
}
//五菱宏光汽车接口实现类
package factory.method;
public class WuLingFactory implements CarFactory {
@Override
public Car getCar(){
return new WuLing();
}
}
//特斯拉汽车接口实现类
package factory.method;
public class TeslaFactory implements CarFactory {
@Override
public Car getCar(){
return new Tesla();
}
}
//消费者类
package factory.method;
public class Consumer {
public static void main(String[] args) {
Car car=new WuLingFactory().getCar();
Car car2=new TeslaFactory().getCar();
car.name();
car2.name();
}
}
工厂方法模式的结构如下图:
比较简单工厂模式和工厂方法模式
结构复杂度:简单工厂模式要比工厂方法模式更加的简单
代码复杂度:简单工厂模式要比工厂方法模式的代码复杂度更简单
编程复杂度:简单工厂模式更加简单
管理上的复杂度:简单工厂模式更加简单
所以在实际选择的时候,虽然工厂方法模式满足设计原则中的开闭性原则,但我们一般还是会选择简单工厂模式,就是只让程序中出现一个工厂,这个工厂中可以生产所有的东西。因为简单工厂模式比较容易操作。
简单工厂模式(静态工厂模式):虽然某种程度上不符合设计原则,但实际使用最多!
工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展。