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

设计模式1:工厂模式

开始学习设计模式,这是小卷学习设计模式的第1篇文章,今天了解下工厂模式,以及框架中用到工厂模式的案例

1.概览

在这里插入图片描述

2.分类

设计模式分为三类:

  • 创建型:在创建对象的同时隐藏创建逻辑,不使用new直接实例化对象,程序判断创建哪些对象时更灵活
  • 结构型:通过类和接口间的继承、引用实现创建复杂结构的对象。
  • 行为型:通过类之间不同通信方式实现不同行为。

工厂模式属于创建型设计模式,具体可以分为三类:

  • 简单工厂模式,定义一个工厂类,根据传入参数动态创建不同类型的对象,缺点是新增产品需要修改工厂类逻辑,违背开闭原则
  • 工厂方法模式,将对象的创建延迟到子类,每个产品对应一个工厂类,扩展更好
  • 抽象工厂模式,用于创建产品族(多个相关联的系列对象),比如汽车工厂同时生产轮胎和引擎

3.简单工厂模式

简单⼯⼚模式指由⼀个⼯⼚对象来创建实例,客户端不需要关注创建逻
辑,只需提供传⼊⼯⼚的参数。

如:Spring的BeanFactory使用了简单工厂模式,根据传入一个唯一标识来获取Bean对象

下面是简单工厂模式的示例代码:

interface Car {
    void drive();
}

class Benz implements Car {
    @Override
    public void drive() {
        System.out.println("Benz.......");
    }
}

class Bmw implements Car {
    @Override
    public void drive() {
        System.out.println("Bmw......");
    }
}

class CarFactory {
    public Car createCar(String type) {
        if ("Benz".equals(type)) {
            return new Benz();
        }
        if ("Bmw".equals(type)) {
            return new Bmw();
        }
        throw new IllegalArgumentException("unknown type");
    }
}

public class SimpleFactory {
    public static void main(String[] args) {
        Car car = CarFactory.createCar("Bmw");
        car.drive(); //输出Bmw......
    }
}

4.工厂方法模式

定义一个抽象⼯⼚,其定义了产品的⽣产接⼝,但不负责具体的产
品,将⽣产任务交给不同的派⽣类⼯⼚

示例代码:

//工厂接口
interface CarFactory {
    Car createCar();
}
//每个产品对应一个工厂
class BenzFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new Benz();
    }
}

class BmwFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new Bmw();
    }
}

public class MethondFactory {
    public static void main(String[] args) {
        CarFactory carFactory = new BenzFactory();
        Car car = carFactory.createCar();
        car.drive(); //输出Benz.......
    }
}

5.抽象工厂模式

简单⼯⼚模式和⼯⼚⽅法模式不管⼯⼚怎么拆分抽象,都只是针对⼀类产
品,如果要⽣成另⼀种产品,就⽐较难办了!

抽象工厂模式通过在 AbstarctFactory 中增加创建产品的接⼝,并在具体⼦
工厂中实现新加产品的创建

//产品族接口(汽车 + 轮胎)
interface Car {
    void drive();
}

interface Tire {
    void wear();
}

//具体产品族,Benz族系列
class BenzCar implements Car {
    @Override
    public void drive() {
        System.out.println("Benz Car.......");
    }
}

class BenzTire implements Tire {
    @Override
    public void wear() {
        System.out.println("Benz Tire......");
    }
}
//抽象工厂接口
interface CarAbstractFactory {
    Car createCar();
    Tire createTire();
}
//具体工厂实现
class BenzFactory implements CarAbstractFactory {
    @Override
    public Car createCar() {
        return new BenzCar();
    }
    @Override
    public Tire createTire() {
        return new BenzTire();
    }
}
//使用
public class AbstractFactory {
    public static void main(String[] args) {
        CarAbstractFactory carAbstractFactory = new BenzFactory();
        Car car = carAbstractFactory.createCar();
        Tire tire = carAbstractFactory.createTire();
        car.drive(); //输出Benz Car.......
        tire.wear();
    }
}

6.具体框架案例

SLF4JLoggerFactory就使用了工厂模式,调用getLogger()方法来获取Logger实例

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Demo {
    private static final Logger logger = LoggerFactory.getLogger(Demo.class);
    
    public static void main(String[] args) {
        logger.info("Hello SLF4J");
    }
}

http://www.kler.cn/a/535896.html

相关文章:

  • 9.建造者模式 (Builder Pattern)
  • 【高阶数据结构(一)】:LRU Cache
  • 【R语言】获取数据
  • 63.视频推荐的算法|Marscode AI刷题
  • 排序算法--插入排序
  • 一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署
  • 软件模拟I2C案例(寄存器实现)
  • 基于微信小程序的在线点餐(堂食)平台的设计与实现ssm+论文源码调试讲解
  • .net8.0使用EF连接sqlite数据库及使用Gridify实现查询的简易实现
  • Python“鉴黄”小程序,自动识别检测物体的颜色
  • 【数据结构】(5) ArrayList 顺序表
  • 确保数据一致性:RabbitMQ 消息传递中的丢失与重复问题详解
  • 如何查看:Buildroot所使用Linux的版本号、gcc交叉编译工具所使用的Linux的版本号、开发板上运行的Linux系统的版本号
  • 使用外骨骼灵活远程控制协作机器人案例
  • 如何利用Java爬虫获取商品销量详情实战指南
  • Spring Boot 自动装配机制深度解析
  • VUE之组件通信(二)
  • Git 分支管理策略与实践
  • 怎麼在Chrome中設置代理伺服器?
  • MySQL 进阶专题:索引(索引原理/操作/优缺点/B+树)
  • 责任链模式(Chain Responsibility)
  • 深度学习里面的而优化函数 Adam,SGD,动量法,AdaGrad 等 | PyTorch 深度学习实战
  • HbuilderX中,实现Gzip的两种方法
  • 【数据结构-Trie树】力扣720. 词典中最长的单词
  • android 打包AAR-引入资源layout-安卓封包
  • 网络计算机的五个组成部分