设计模式——工厂模式

  • 设计模式是一种经过时间实践证明有效解决软件设计问题的方法,提供了一套经验丰富的解决方案,可以用于解决常见的软件设计问题,从而使得代码更加灵活,可读性更高,让代码更容易维护和扩展。
  • 设计模式的类型分为三种:
    • 创建型:创建型关注对象的创建机制,旨在通过各种方式创建对象,而不是直接在代码中使用new关键字。
    • 结构型:结构型关注对象和类之间的关系,旨在通过组合类和对象形成更大的结构,以便更好的实现系统的结构和功能。
    • 行为型:行为型关注对象之间的通信和协作方式,旨在定义对象之间的算法和责任分配。
  • 解耦:降低系统中的不同模块,组件或对象之间的依赖关系,使得他们之间的耦合度减少。

工厂模式包含模块

  • 抽象产品(Product):定义通用产品接口,所有具体产品都要实现这个接口。
  • 具体产品(Concrete Product):实现抽象产品接口的具体产品类。
  • 抽象工厂(Abstract Factory):定义创建产品的方法,可以是接口或者抽象类。
  • 具体工厂(Concrete Factory):实现抽象工厂接口,负责具体产品的创建。

简单工厂

  • 定义:由一个工厂对象决定创建出哪一种产品类的实例。(不属于23种设计模式
  • 优势:只需要传入工厂类参数,对于如何创建对象的逻辑无需关心。
  • 弊端:只能对少量对象进行管理,如果要增加新的产品时需要修改工厂类的判断逻辑,不易于扩展过于复杂的产品结构。
  • 抽象产品-ICourse
public interface ICourse {
    /**
     * 课程录制
     */
    void record();
}
  • 具体产品1-JavaCourse
public class JavaCourse implements ICourse{
    @Override
    public void record() {
        System.out.println("java课程录制");
    }
}
  • 简单工厂
public class CourseSimpleFactory {
    public ICourse create(Class<? extends ICourse> clazz) {
        try {
            if (null != clazz) {
                return (ICourse) clazz.newInstance();
            }
        } catch (InstantiationException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return null;
    }
}

工厂方法模式

  • 类型:创建型
  • 定义:工厂模式是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化延迟到子类中进行。(工厂方法可以根据需求动态创建对象,而不需要在代码中直接使用具体类来创建对象)
  • 应用场景:创建对象需要大量复用代码。
  • 优势:底层代码无需关心产品类实例如何被创建,实现等细节。
  • 弊端:类的数量过多,增加代码结构的复杂度,增加系统的抽象性和理解难度。
  • 抽象工厂
public interface ICourseFactory {
    public ICourse create();
}

  • 工厂接口实现
public class JavaCourseFactory implements ICourseFactory{
    @Override
    public ICourse create() {
        return new JavaCourse();
    }
}
  • 测试
    @Test
    public void testJavaCourseCreate(){
        ICourseFactory iCourseFactory = new JavaCourseFactory();
        ICourse course = iCourseFactory.create();
        course.record();
    }
  • 工厂模式类图
    工厂模式类图

抽象工厂模式

  • 定义:提供一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类。
  • 弊端:规定了所有可能被创建的产品集合,产品族中扩展新的产品很困难,需要修改抽象工厂的接口。(违反开闭原则)
  • 优势:将具体产品在应用层代码隔离,无需关心创建细节;将一个系列的产品族统一到一起创建。
  • 应用场景
    • 应用层不依赖于产品类实例如何被创建,实现等细节;
    • 强调一系列相关的产品对象一起使用创建对象需要大量重复代码;
    • 提供一个产品类库,所有产品以同样的接口出现,从而使客户端不依赖于具体实现。
  • 产品族:指一组相关或相互依赖的产品集合。这些产品通常具有共同的主题、特性或用途,可以在同一个环境下相互配合使用。
    • 假设某个公司生产手机及其配件,那么手机是一个产品,而手机壳、充电器、耳机等就是手机配件。这些产品共同构成了手机产品族,因为它们在功能、使用场景、品牌等方面有着共同的特点和关联。
  • 抽象工厂接口
public abstract class AbstractCourseFactory {
    public void init() {
        System.out.println("初始化基础数据");
    }

    public abstract INote createNote();

    public abstract IVideo createVideo();
}

  • 抽象工厂实现类
public class JavaCourseFactory extends AbstractCourseFactory{
    @Override
    public INote createNote() {
        super.init();
        return new JavaNote();
    }

    @Override
    public IVideo createVideo() {
        super.init();
        return new JavaVideo();
    }
}
  • 产品族:note
public interface INote {
    void edite();
}
public class JavaNote implements INote {
    @Override
    public void edite() {
        System.out.println("编辑java笔记");
    }
}
  • 产品族:video
public interface IVideo {
    void play();
}

public class JavaVideo implements IVideo{
    @Override
    public void play() {
        System.out.println("播放java视频");
    }
}
  • 应用层调用
    @Test
    public void testCreateJavaFactory(){
        AbstractCourseFactory factory = new JavaCourseFactory();
        factory.createNote().edite();
        factory.createVideo().play();
    }
  • 抽象工厂类图:
    抽象工厂类图

相关推荐

  1. 设计模式工厂模式

    2024-03-27 04:10:06       69 阅读
  2. 设计模式--工厂模式

    2024-03-27 04:10:06       53 阅读
  3. 设计模式 工厂模式

    2024-03-27 04:10:06       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 04:10:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 04:10:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 04:10:06       87 阅读
  4. Python语言-面向对象

    2024-03-27 04:10:06       96 阅读

热门阅读

  1. jsp学习

    jsp学习

    2024-03-27 04:10:06      41 阅读
  2. 线程: park & unpark(2)

    2024-03-27 04:10:06       40 阅读
  3. 基于画布canvas进行图片压缩

    2024-03-27 04:10:06       43 阅读
  4. 给wordpress添加自定义字段的分类筛选功能

    2024-03-27 04:10:06       43 阅读
  5. 【C++】每日一题,238 除自身以外数组的乘积

    2024-03-27 04:10:06       36 阅读
  6. [蓝桥杯 2019 省 B] 特别数的和

    2024-03-27 04:10:06       38 阅读
  7. StringRedisTemplate Autowired注入为空解决

    2024-03-27 04:10:06       39 阅读
  8. 20240325 大模型快讯

    2024-03-27 04:10:06       39 阅读