设计模式-三大工厂模式

三大工厂模式分别是:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

1. 简单工厂模式

  • 由一个工厂决定创建哪一种产品类型的实例,只给外界一个获得产品的接口,不对外开放制造产品的细节。

说直白点,简单工厂模式就是在原本通过自己手动new出对象(产品),进行了一个优化,不想让构建细节被外部所感知到,所以加了一个工厂,由工厂执行对应的构建细节,而外部的人想要对应的产品的时候,只需要以某种标识进行获得产品这一接口的调用。

1.1 代码示例

一个Course 产品基类:

java 复制代码
public abstract class Course {
    //制作
    public abstract void make();
}

一个具体的JavaCourse 产品子类:

java 复制代码
public class JavaCourse extends Course{
    @Override
    public void make() {
        System.out.println("制作Java课程");
    }
}

一个具体的PythonCourse 产品子类:

java 复制代码
public class PythonCourse extends Course{
    @Override
    public void make() {
        System.out.println("制作Python课程");
    }
}

一个CourseFactory 工厂类:

java 复制代码
public class CourseFactory {

    //由工厂来进行产品的制作,不对外展示细节
    public static Course getCourse(String courseType) {
        if ("java".equalsIgnoreCase(courseType)) {
            return new JavaCourse();
        } else if ("python".equalsIgnoreCase(courseType)) {
            return new PythonCourse();
        } else {
            throw new RuntimeException("没有这种类型的课程");
        }
    }
}

测试

java 复制代码
public class Test {

    public static void main(String[] args) {
//        String name = "java";
        String name = "python";
        Course course = CourseFactory.getCourse(name);
        course.make();
    }
}

1.2 总结

简单工厂模式对外部隐藏了产品(对象)的构建,只需要执行工厂对外开放的接口,并进行需要产品的唯一标识告知,就可以获得需要的产品。

但是,简单工厂模式如果需要添加新的产品,需要修改本身的工厂代码,违反开放封闭原则 ,而且一个工厂进行了很多产品的制作,也不符合单一职责原则。基于这些,引出了工厂方法模式。

2. 工厂方法模式

对于一系列的同一类别的产品(对象),抽象出一个抽象工厂来确定所有类别的产品的共有逻辑。对于不同的产品,由不同类别的工厂实现类,执行自己的产品制作。需要添加新的产品的时候,就新建一个工厂实现类(满足开放封闭,也满足单一职责)。

2.1 代码示例

一个Course 产品基类:

java 复制代码
public abstract class Course {
    //制作
    public abstract void make();
}

一个具体的JavaCourse 产品子类:

java 复制代码
public class JavaCourse extends Course{
    @Override
    public void make() {
        System.out.println("制作Java课程");
    }
}

一个具体的PythonCourse 产品子类:

java 复制代码
public class PythonCourse extends Course{
    @Override
    public void make() {
        System.out.println("制作Python课程");
    }
}

一个CourseFactory 抽象工厂

java 复制代码
public abstract class CourseFactory {
    public abstract Course getCourse();
}

一个JavaCourseFactory 工厂实现类:

java 复制代码
public class JavaCourseFactory extends CourseFactory{
    @Override
    public Course getCourse() {
        return new JavaCourse();
    }
}

一个PythonCourseFactory 工厂实现类:

java 复制代码
public class PythonCourseFactory extends CourseFactory{
    @Override
    public Course getCourse() {
        return new JavaCourse();
    }
}

测试

java 复制代码
public class Test {
    public static void main(String[] args) {
//        CourseFactory factory = new JavaCourseFactory();
        CourseFactory factory = new PythonCourseFactory();

        Course course = factory.getCourse();
        course.make();
    }
}

2.2 总结

工厂方法模型,对简单工厂模型进行了优化,对于一类别的产品的共有逻辑进行抽象,对各自的实现逻辑进行了解耦,把一个复杂工厂进行了职责分离。且增加了程序的扩展性。但是,如果需要的是一系列的产品,也就是说不是管理一个产品,而是管理一系列产品,不可能一系列产品也分为多个类别,每个类别都抽象自己的抽象工厂,有各自的工厂实现,这样的话我需要一个系列产品的时候,我还得找到一系列的工厂进行产品获取。既然每次都是需要一个系列的产品,也就是套餐售卖嘛,那把一个系列的套餐封装进行一个工厂,引出了抽象工厂模型。

3. 抽象工厂模型

抽象工厂模式提供了创建一系列相关或互相依赖对象的接口,对这些系列产品抽象出系列产品中各个产品各自的共有逻辑,得到抽象工厂。对不同的系列,由不同的工厂实现类来确定各自的实现逻辑。

直白的说,抽象工厂模型就是一个套餐售卖,原本的一个产品一个产品的逻辑太杂乱了,外部根本无法自己完成整个系列的获取(压根不知道市面上有些什么沙发、衣柜、壁橱等等,干脆你给我一堆一堆的方案,我只负责方案的选择)。

3.1 代码

车门的抽象类

java 复制代码
/**
 * 车门系列的抽象类
 */
public abstract class CarDoor {
    public abstract void open();
}

A 品牌车门的实现类

java 复制代码
public class CarDoorBrandA extends CarDoor{
    @Override
    public void open() {
        System.out.println("A牌的车门可以正常开关");
    }
}

B 品牌车门的实现类

java 复制代码
public class CarDoorBrandB extends CarDoor{
    @Override
    public void open() {
        System.out.println("B牌的车门可以正常开关");
    }
}

车架的抽象类

java 复制代码
/**
 * 车架系列的抽象类
 */
public abstract class CarFrame {
    public abstract void hard();
}

A 品牌车架的实现类

java 复制代码
public class CarFrameBrandA extends CarFrame{
    @Override
    public void hard() {
        System.out.println("A牌的车架很牢固");
    }
}

B 品牌车架的实现类

java 复制代码
public class CarFrameBrandB extends CarFrame{
    @Override
    public void hard() {
        System.out.println("B牌的车架很牢固");
    }
}

底盘的抽象类

java 复制代码
/**
 * 底盘系列的抽象类
 */
public abstract class CarBasePlate {
    public abstract void stable();
}

A 品牌底盘的实现类

java 复制代码
public class CarBasePlateBrandA extends CarBasePlate{
    @Override
    public void stable() {
        System.out.println("A牌的底盘很平稳");
    }
}

B 品牌底盘的实现类

java 复制代码
public class CarBasePlateBrandB extends CarBasePlate{
    @Override
    public void stable() {
        System.out.println("B牌的底盘很平稳");
    }
}

一个抽象工厂CarFactory ,规范了车门,车架,底盘这属于一个系列产品的各自共有逻辑

java 复制代码
/**
 * 一个抽象工厂,定义了一系列的抽象产品的获取方法
 */
public abstract class CarFactory {
    public abstract CarDoor getCarDoor();

    public abstract CarFrame getCarFrame();

    public abstract CarBasePlate getCarBasePlate();
}

A 品牌系列 的工厂实现类

java 复制代码
public class CarBrandAFactory extends CarFactory{
    @Override
    public CarDoor getCarDoor() {
        return new CarDoorBrandA();
    }

    @Override
    public CarFrame getCarFrame() {
        return new CarFrameBrandA();
    }

    @Override
    public CarBasePlate getCarBasePlate() {
        return new CarBasePlateBrandA();
    }
}

B 品牌系列 的工厂实现类

java 复制代码
public class CarBrandBFactory extends CarFactory{
    @Override
    public CarDoor getCarDoor() {
        return new CarDoorBrandB();
    }

    @Override
    public CarFrame getCarFrame() {
        return new CarFrameBrandB();
    }

    @Override
    public CarBasePlate getCarBasePlate() {
        return new CarBasePlateBrandB();
    }
}

测试

java 复制代码
public class Test {
    public static void main(String[] args) {
//        CarFactory carFactory = new CarBrandAFactory();
        CarFactory carFactory = new CarBrandBFactory();

        CarDoor carDoor= carFactory.getCarDoor();
        CarFrame carFrame = carFactory.getCarFrame();
        CarBasePlate carBasePlate = carFactory.getCarBasePlate();

        carDoor.open();
        carFrame.hard();
        carBasePlate.stable();
    }
}

3.2 总结

工厂方法模式是为了管理一个产品而出现的工厂,抽象工厂模式是为了进一步管理一套产品系列而出现的工厂。

相关推荐
让学习成为一种生活方式14 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画19 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生42 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田1 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
神里大人1 小时前
idea、pycharm等软件的文件名红色怎么变绿色
java·pycharm·intellij-idea
小冉在学习2 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论
代码之光_19802 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi2 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet