设计模式1:工厂模式

本文涉及的产品
性能测试 PTS,5000VUM额度
云原生网关 MSE Higress,422元/月
函数计算FC,每月15万CU 3个月
简介: 本文是小卷学习设计模式系列的开篇,主要介绍了工厂模式及其在框架中的应用。工厂模式属于创建型设计模式,分为简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式由一个工厂类根据参数创建对象;工厂方法模式通过子类实现具体对象的创建;抽象工厂模式用于创建多个相关联的对象族。文中还展示了Spring的`BeanFactory`和SLF4J的`LoggerFactory`作为实际案例。

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

1.概览

概览.png

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");
    }
}
相关文章
|
9月前
|
设计模式 存储 Java
设计模式-工厂模式
设计模式-工厂模式
79 1
|
9月前
|
设计模式
设计模式【二】:工厂模式
设计模式【二】:工厂模式
52 0
|
设计模式 Java
设计模式~工厂模式-03
工厂模式 简单工厂模式 优点: 缺点: 工厂方法模式
63 0
|
设计模式 Java C++
设计模式之工厂模式详解和应用
设计模式之工厂模式详解和应用
83 0
|
8月前
|
设计模式 数据格式 XML
设计模式-工厂模式-1-1
【6月更文挑战第10天】本文介绍了工厂模式的两种主要类型:简单工厂和工厂方法。简单工厂模式通过工厂类动态创建对象,例如根据配置文件后缀选择不同解析器。为提高可读性和复用性,可将创建逻辑封装到独立类中。当需添加新解析器时,可能涉及对工厂类的修改,但这在偶尔调整时可接受。工厂方法模式则通过多态消除if分支,增加扩展性,更符合开闭原则。当需要新增解析器时,只需创建实现特定接口的新工厂类。
39 2
设计模式-工厂模式-1-1
|
8月前
|
设计模式 XML 缓存
设计模式-工厂模式-1-2
【6月更文挑战第11天】工厂模式用于封装对象创建,但当load函数与工厂类耦合时,问题出现。为解决此问题,引入了工厂的工厂,如`RuleConfigParserFactoryMap`,它创建并缓存工厂对象,简化了代码修改。然而,过多的Factory类会增加复杂性,简单工厂模式在此类应用中更为适用。当对象创建逻辑复杂,需组装其他对象或避免if-else时,采用工厂方法模式。抽象工厂则处理多维度分类的对象创建。总结:工厂模式的核心价值在于封装变化、代码复用、隔离复杂性和控制复杂度,适用于创建逻辑复杂的情况,否则直接使用new操作即可。
37 5
|
9月前
|
设计模式 算法 uml
C++设计模式(工厂模式)
C++设计模式(工厂模式)
124 1
C++设计模式(工厂模式)
|
9月前
|
设计模式 前端开发 API
【设计模式】之工厂模式
工厂模式是一种常用的创建对象的设计模式,它通过封装对象的创建逻辑,提供统一的接口,实现了代码的解耦和可扩展性。在实际开发中,可以根据具体需求选择是否使用工厂模式来创建对象。工厂模式可以应用于任何需要创建对象的场景。通过使用工厂模式,我们可以提高代码的可维护性、可扩展性和可测试性,使得代码更加灵活和易于理解。
88 0
|
设计模式
设计模式之工厂模式
设计模式之工厂模式
75 0
|
设计模式
【设计模式】工厂模式
【设计模式】工厂模式