设计模式之工厂模式

作用与本质

  • 作用:实现了创建者和调用者的分离
  • 核心本质:
    • 实例化对象不使用new,用工厂方法代替
    • 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦

三种模式

一、简单工厂模式

  • 用来生产同一等级结构中的任意产品(对于增加新的产品,需要覆盖已有代码)

代码实现

  • 例如我们要成产车的一个工厂类:首先建一个Car的接口,包含车品牌的方法
public interface Car {
    void car();
}
  • Car接口实现类:Dazhong,Wuling
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方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值