工厂模式
1、作用:实现了创建者和调用者的分离,方便调用者。调用者只需携带调用的需求访问工厂即可获取满足其需求的对象,而对象创建的过程无需调用者过问。
2、详细分类:
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
3、满足OOP七大原则:
- 开闭原则:一个软件实体应当对扩展开放,对修改关闭
- 依赖倒转原则:要针对接口编程,不要针对实现编程
- 迪米特法则:只与你直接的朋友通信,而避免和陌生人通信
4、本质:
- 实例化对象不适用new,用工厂的方法代替
- 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦
各种工厂模式代码
以Car接口为例
public interface Car{ //Car接口
void name();
}
public class WuLing implements Car{ //实现类一
void name(){
System.out.println("五菱宏光");
}
}
public class Tesla implements Car{ //实现类二
void name(){
System.out.println("特斯拉");
}
}
简单工厂模式
使用一个工厂类来生产对应接口的所有实现类
实现方式一:
使用一个静态方法,根据输入参数即可获取满足需求的该接口(类)的实现类(子类)
public class CarFactory{
public static Car getCar(String name){
if("五菱宏光".equals(name)){
return new WuLing();
}else if("特斯拉".equals(name)){
return new Tesla();
}
}
}
实现方式二:
为每一种实现类提供一种静态方法
public class CarFactory{
public static Car getWuLing(){
return new WuLing();
}
public static Car getTesla(){
return new Tesla();
}
}
优点:结构简单、代码简单、易于管理、常用于实际业务
缺点:扩展时违反开闭原则问题,方式一需要修改方法,方式二需要修改类
工厂方法模式
为每一种实现类创建各自的工厂。不仅实现类有统一的Car接口,这些工厂也有统一的Factory接口。
public class WuLingFactory{ //为五菱宏光单独造个工厂
public static Car getCar(){
return new WuLing();
}
}
public class WuLingFactory{
public static Car getCar(){
return new WuLing();
}
}
优点:扩展新的实现类时无需对现有的类做修改,满足开闭原则。每个Car有接口,每个工厂也有接口,满足依赖倒转原则
缺点:为每一个实现类都加一个工厂,开销太大。结构复杂、代码复杂、不易于管理
抽象工厂模式
手机产品接口
public interface IphoneProduct{
void start();
void shutdown();
void sendSMS();
}
路由器产品接口
public interface IphoneProduct{
void start();
void shutdown();
void sendSMS();
}