作用与本质
作用:实现了创建者和调用者的分离 核心本质:
实例化对象不使用new,用工厂方法代替 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦 。
三种模式
一、简单工厂模式
用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)
代码实现
例如我们要成产车的一个工厂类:首先建一个Car的接口,包含车品牌的方法
public interface Car {
void car ( ) ;
}
public class Wuling implements Car {
@Override
public void car ( ) {
System. out. println ( "五菱" ) ;
}
}
public class Dazhong implements Car {
@Override
public void car ( ) {
System. out. println ( "大众" ) ;
}
}
public class CarFactory {
public static Car Car ( String s ) {
if ( s. equals ( "大众" ) ) {
return new Dazhong ( ) ;
} else if ( s. equals ( "五菱" ) ) {
return new Wuling ( ) ;
} else return null ;
}
public static Car getWuling ( ) {
return new Wuling ( ) ;
}
public static Car getDazhong ( ) {
return new Dazhong ( ) ;
}
}
CarTest此时就直接调用工厂方法实现对象的实例化
public class CarTest {
public static void main ( String [ ] args) {
Car car = CarFactory. Car ( "大众" ) ;
Car car1 = CarFactory. Car ( "五菱" ) ;
car. car ( ) ;
car1. car ( ) ;
}
}
模式分析
不满足开闭原则,对于新产品的加入需要修改源代码,所以简单工厂模式又称静态工厂模式
二、工厂方法模式
用来生产同一等级结构中的固定产品(支持增加任意产品)
代码实现
public interface CarFactory {
Car getCar ( ) ;
}
在简单工厂模式下增加了多个工厂去实例化对应品牌的车对象
public class DazhongFactory implements CarFactory {
@Override
public Car getCar ( ) {
return new Dazhong ( ) ;
}
}
public class WulingFactory implements CarFactory {
@Override
public Car getCar ( ) {
return new Wuling ( ) ;
}
}
这样我们只需要去对接每个车工厂就能得到相应车的实例
public class CarTest {
public static void main ( String [ ] args) {
Car car = new DazhongFactory ( ) . getCar ( ) ;
Car car1 = new WulingFactory ( ) . getCar ( ) ;
car. car ( ) ;
car1. car ( ) ;
}
}
模式分析
满足了开闭原则,但是每增加一个产品就会添加相应的类,所以在结构、代码、编程和管理复杂度上来说没有简单工厂模式 好,在实际业务中使用最多
三、抽象工厂模式
围绕一个超级工厂创建 其他工厂 。该超级工厂又称为其他工厂的工厂。(不可以增加产品,但可以增加产品族)
定义
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
适用场景
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现
优点
具体产品在应用层的代码隔离,无需关心创建的细节将一个系列的产品统一到一起创建
缺点
规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难; 增加了系统的抽象性和理解难度
UMl类图
流程图
应用场景
JDK中Calendar的getInstance方法 JDBC中的Connection对象的获取 Spring中IOC容器创建管理bean对象 反射中Class对象的newlnstance方法