什么是工厂模式
工厂设计模式,理解为用来生产对象的,Java是面向对象编程语言,Java语言中,对象都是需要创建的,对象都是通过关键字new实例化,试想,如果在程序中需要实例化10个对象,遇到需求变更,实例化的对象需要改变,那实例化对象的10处地方都需要修改;这个时候可以设计为工厂模式,如果获取对象不是直接new实例化的,而是通过工厂获取对象,那么,对象有修改的时候,只需要通过修改工厂中的对象,就可以将所有的对象修改,所有得出工厂模式的最大优点是:解耦
核心本质
实例化对象不使用new, 用工厂方法代替。
将选择实现类, 创建对象统一管理和控制. 从而将调用者跟我们的实现类解耦。
三种模式:
简单工厂模式
用来生产统一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)
工厂方法模式
用来生产同一等级结构中的固定产品(支持增加任意产品)
抽象工厂模式
围绕一个超级工厂创建其他工厂, 该超级工厂又称为其他工厂的工厂
简单工厂
在简单工厂模式中创建实例的方法通常为静态(static)方法,因此简单工厂模式(Simple FactoryPattern)又叫作静态工厂方法模式(Static Factory Method Pattern)。
简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在 GoF 23 种设计模式之列。
public interface Car {
void name();
}
public class CarFactory {
//静态工厂模式
//增加一个新的产品如果不修改代码做不到
//方法一
public static Car getCar(String car){
if (car.equals("大众")){
return new Dazhong();
}else if(car.equals("特斯拉")){
return new Tesla();
}else return null;
}
//方法二
public static Car getDazhong(){
return new Dazhong();
}
public static Car getTesla(){
return new Tesla();
}
public class Consuemr {
public static void main(String[] args) {
//接口,所有实现类最原始的
// Dazhong dazhong = new Dazhong();
// Tesla tesla = new Tesla();
// dazhong.name();
// tesla.name();
Car dazhong=CarFactory.getCar("五菱宏光");
Car tesla=CarFactory.getCar("特斯拉");
dazhong.name();
tesla.name();
}
public class Tesla implements Car {
@Override
public void name() {
System.out.println("Tesla");
}
public class Dazhong implements Car{
@Override
public void name() {
System.out.println("Dazhong");
}
简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。
工厂模式
public interface Car {
void name();
}
public interface CarFactoty {
//工厂方法模式
Car getCar();
}
public class Consumer {
//接口,所有实现类
public static void main(String[] args) {
Car car = new TeslaFactory().getCar();
car.name();
Car car1 = new DazhongFactory().getCar();
car1.name();
}
//结构复杂度: simple
//代码复杂度: simple
//编程复杂度: simple
//管理上的复杂度: simple
//舰据设计原则:工厂方法模式!
//根据实际业务:简单工厂模式!
}
public class Dazhong implements Car{
@Override
public void name() {
System.out.println("大众");
}
}
public class DazhongFactory implements CarFactoty{
@Override
public Car getCar() {
return new Dazhong();
}
}
public class Tesla implements Car{
@Override
public void name() {
System.out.println("特斯拉");
}
}
public class TeslaFactory implements CarFactoty{
@Override
public Car getCar() {
return new Tesla();
}
}
抽象工厂
定义︰抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
适用场景:
客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现
优点:
具体产品在应用层的代码隔离,无需关心创建的细节
将一个系列的产品统一到一起创建
缺点:
规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难;
增加了系统的抽象性和理解难度
小结
简单工厂模式(静态工厂模式)虽然某种程度上不符合设计原则, 但实际使用最多
工厂方法模式 不修改已有类的前提下, 通过增加新的工厂类实现扩展
抽象工厂模式 不可以增加产品, 可以增加产品族
应用场景
JDK中Calendar的getInstance方法
JDBC中的Connection对象的获取
Spring中IOC容器创建管理bean对象
反射z中Class对象的newstance方法