工厂模式
工厂模式(Factory Pattern)是java中最常用的设计模式之一,这种类型的设计模式属于创建型模式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂模式实现了创建者和调用者的分离。通常指的三个工厂模式:简单工厂模式(静态工厂模式),工厂方法模式,抽象工厂模式。
OOP设计的基本原则:
1. 开闭原则(OCP):一个软件的实体应当对应扩展开放,对修改关闭
2. 依赖倒转原则(DIP):要针对接口编程,不要针对实现编程
3. 迪米特法则(LOD):只与你直接的朋友通信,而避免和陌生人通信
工厂模式的核心本质:
1. 实例化对象不使用new,用工厂方法代替
2. 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们实现类解耦
1. 简单工厂模式(静态工厂模式)
用来生产同一等级结构中的任意产品(对于新增产品,必须要覆盖已有的代码)
直接看代码:
定义一个抽象类Car
public interface Car(){
public void getCarType();
}
定义具体的产品:
package com.dsx.factorytest;
public class BaoMa implements Car{
@Override
public void getCarType() {
System.out.println("宝马车");
}
}
package com.dsx.factorytest;
public class Audi implements Car {
@Override
public void getCarType() {
System.out.println("奥迪");
}
}
定义一个工厂生产具体产品:
package com.dsx.factorytest;
public class CarFactory {
//提供静态的创建Car的方法
public static Car getCar(String type){
if(type.equals("奥迪")){
return new Audi();
}else if(type.equals("宝马")){
return new BaoMa();
}else{
return null;
}
}
}
从简单工厂中可以看出使用一个静态方法将实例化的创建和使用分离开。只需要调用方法传递参数就可以获得我们需要的对象。
缺点:如果我们想要增加一种劳斯莱斯类型的产品不仅需要添加一个产品类而且必须修改静态方法getCar.这样就违背了开闭原则(对于扩展是开放的,对于修改是封闭的)
2. 工厂方法模式
用来生产同一等级结构中的固定产品(支持增加任意产品)
我们先了解工厂模式的具体概念:
抽象工厂:工厂模式的核心,提供一个创建对象的接口,任何需要创建对象的具体工厂都要实现这个接口。
具体工厂:实现抽象工厂接口的类,受到调用者的调用从而创建对象。
抽象产品:工厂方法模式所创建的对象的超类。也就是所有具体产品的共同父类。
具体产品:实现抽象工厂接口的类。工厂模式中所有创建的对象都是具体产品的实例。
生产不同产品的工厂的抽象类
public interface Car {
public void getCarType();
}
定义具体的产品
package com.dsx.factorytest;
public class BaoMa implements Car{
@Override
public void getCarType() {
System.out.println("宝马车");
}
}
package com.dsx.factorytest;
public class Audi implements Car {
@Override
public void getCarType() {
System.out.println("奥迪");
}
}
抽象工厂:
public interface AbstractFactory {
Car makeCar();
}
具体工厂:
class BaoMaFactory implements AbstractFactory{ @Override public Car makeCar() { return new BaoMa(); } } class AudiFactory implements AbstractFactory{ @Override public Car makeCar() { return new Audi(); } }
测试代码:
public static void main(String[] args) {
new BaoMaFactory().makeCar().getCarType();
new AudiFactory().makeCar().getCarType();
}
如上所示:当要增加一个新的车的类型,需要增加相应的工厂类,不需要修改代码的任何方法。当我们需要新产品时只需要makeCar,不用关心其他,有良好的封装性。 3. 抽象工厂模式 围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
项目结构:
具体代码:
抽象工厂:
小米系列:
华为系列同理(此处省略)。
优点:
1. 具体产品在哪个应用层的代码隔离,无需关心创建的细节
2. 将一个系列的产品统一到一起创建
缺点:
1. 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难
2. 增加了系统的抽象性和理解难度
上面介绍的三种工厂模式各有各自的应用场景,实际应用时能解决问题满足需求即可,可灵活变通,无所谓高级与低级。
小结:
简单工厂模式(静态工厂模式):虽然某种程度上不符合设计原则,但实际使用最多!
工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展。
抽象工厂模式:不可以增加产品,可以增加产品族!
应用场景:
1. JDK中的Calendar的getInstance方法
2. JDBC的Connection对象的获取
3. Spring中的IOC容器创建管理bean对象
4. 反射Class对象的newInstance()方法
如有不足,欢迎留言指正。望不吝赐教!!!