当前位置: 首页 > article >正文

设计模式(二)工厂模式详解

设计模式(二)工厂模式详解

简单工厂模式指由一个工厂对象来创建实例,适用于工厂类负责创建对象较少的情况。例子:Spring 中的 BeanFactory 使用简单工厂模式,产生 Bean 对象。

工厂模式简介

  • 定义:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,不需要指定具体的类,而是通过一个专门的工厂类来创建对象。

  • 主要用途:当一个类的实例化过程较为复杂或需要根据不同的条件创建不同的对象时,可以使用工厂模式来封装对象的创建逻辑。

  • 实现了创建者和调用者的分离

  • 详细分类:

    1. 简单工厂模式

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

    2. 工厂方法模式

      用来生产同一个等级结构中的固定产品(支持增加任意产品)

    3. 抽象工厂模式

      围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。

核心本质:

  • 实例化对象不使用new,用工厂方法代替。

  • 将选择实现类,创作对象统一管理和控制,从而将调用者跟我们的实现类解耦

简单工厂模式:

// car接口
public interface Car {
    void name();
}
// 两辆车实现car接口
// 特斯拉
public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

// 五菱
public class WuLing implements Car{
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}
// 一个汽车工厂进行造汽车
package com.briup.patterns_design.factory.simple;

/**
 * @author 35329
 *
 * 简单工厂模式 也是 静态工厂模式 (没有满足开闭原则)
 * 增加了一个新的产品,如果你不修改代码,就实现不了,做不到
 *
 * 但是大多数使用的就是简单工厂模式
 */
public class CarFactory {

    // 方法一:
    public static Car getCar(String car){
        if ("五菱".equals(car)){
            return new WuLing();
        }else if ("特斯拉".equals(car)){
            return new Tesla();
        }else {
            return null;
        }
    }

    // 方法二:
    public static Car getWuling(){
        return new WuLing();
    }
    public static Car getTesla(){
        return new Tesla();
    }
}
// 消费者类 进行买车
public class Consumer {
    public static void main(String[] args) {
        // 接口。实现所有的实现类
        Car car = new WuLing();
        Car car2 = new Tesla();

        car.name();
        car2.name();
        System.out.println("==============================");

        // 使用工厂创建
        Car car3 = CarFactory.getCar("五菱");
        Car car4 = CarFactory.getCar("特斯拉");
        car3.name();
        car4.name();
    }
}

d940ca614ce74c28bbdc95c73b04994b.png

工厂方法模式:

// 车car接口
public interface Car {
    void name();
}

// 车工厂接口
public interface CarFactory {
    Car getCar();
}
// 两辆车实现car接口 重写car中的抽象方法
public class Tesla implements Car {
    @Override
    public void name() {
        System.out.println("特斯拉");
    }
}

public class WuLing implements Car {
    @Override
    public void name() {
        System.out.println("五菱宏光");
    }
}
// 两辆车的工厂实现车工厂接口 重写造车方法
public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

public class WuLingFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new WuLing();
    }
}
// 消费者直接从不同品牌的车工厂中,拿到车;
public class Consumer {
    public static void main(String[] args) {
        Car car = new WuLingFactory().getCar();
        Car car2 = new TeslaFactory().getCar();

        car.name();
        car2.name();
    }
    
    // 简单工厂模式和工厂方法模式比较:
    // 结构复杂度: simple
    // 代码复杂度:simple
    // 编程、管理上的复杂度:simple

    // 根据设计原则:工厂方法模式!
    // 根据实际业务:简单工厂模式!
}

b4f110e510044a21b1ee4e6622b7bbc1.png

代码结构:

41a237f81822415ca0f59db341a8980c.png

 


http://www.kler.cn/news/364948.html

相关文章:

  • Linux可分配内存和空闲内存
  • uniapp基础笔记
  • 开源模型应用落地-LangChain实用小技巧-带阈值的相似性搜索(十五)
  • PyTorch模型参数初始化
  • 利用数据库过滤和元数据提取提升多跳查询的RAG性能
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (四):状态码的使用
  • 数据结构_day3
  • 在Spring中,什么是配置类
  • 【C语言】自定义类型:结构体(下)
  • 《首尔破笑组:在欢笑中触摸生活的温度》
  • 给已经写好的裸机程序移植freeRTOS操作系统(二)
  • 6.Three.js贴图与uv映射(uv坐标)理解和实践
  • 鸿蒙应用示例:仿钉钉日历新建日程
  • C语言中的分支与循环(中 1)
  • Java中的基本数据类型和引用类型存储在JVM中那个区域?
  • 缓存池(对象池)使用
  • 现代山东比较出名的人物颜廷利:以塑造智慧为荣,以失去素质为耻
  • MATLAB Simulink (一)直接序列扩频通信系统
  • 深入理解 RabbitMQ 及在.NET 中的应用
  • 碰一碰发视频源码开发,矩阵短视频新模式,支持OEM
  • Python基础知识-模块与包篇
  • H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)
  • 【Linux】命令行参数环境变量
  • vue 对象拷贝,解决引用赋值内容变化会修改原对象的方式
  • 【K8S】快速入门Kubernetes
  • Lua 语言中的注释详解