创建型设计模式 - 抽象工厂模式 - JAVA

发布时间:2023年12月28日

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱

抽象工厂设计模式是创建模式之一。抽象工厂模式 几乎与 工厂模式 相似,只是它更像工厂的工厂

一. 简介

看本片文章前,可以先看 工厂设计模式,您会注意到我们有一个 Factory 类。该工厂类根据提供的输入返回不同的子类,工厂类使用 if-else 或 switch 语句来实现此目的。在抽象工厂模式中,我们摆脱了 if-else 块,每个子类都有一个工厂类,然后设置一个抽象工厂类工厂类去实现这个抽象工厂。工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。大白话可能没办法讲清楚,接下来会通过代码解释,这样就能很容易掌握和理解工厂模式抽象工厂模式之间的细微差别。

二. 列子

就像我们的工厂模式案例一样,我们将使用相同的超类和子类

假如我们要做一个电脑购买系统,里面有台式机 和笔记本 ,他们是 电脑(Computer)类别,在购买的时候可以选择内存(memory)和磁盘(disk)两个参数。可是台式机又有 华为台式机 (HuaWeiPc)小米台式机(XiaoMiPc) , 笔记本又有 华为笔记本(HuaWeiLaptop)小米笔记本(XiaoMiLaptop)台式机和笔记本是一个等级,华为和小米又是一个等级,这种多态性就适合使用抽象工厂设计模式,类图如下:

image-20231227233927261

这里设置一个抽象工厂(ComputerAbstractFactory), 台式机 (PcFactory),笔记本(LaptopFactory)这两个工厂实现他,创建一个工厂(ComputerFactory)给客户端提供创建子类的入口点

2.1 定义电脑的抽象类和子类

电脑抽象类

/**
 * 电脑抽象类
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:09
 */
public abstract class Computer {

    /**
     * 内存抽象方法
     * @return string
     */
    public abstract String memory();

    /**
     * 磁盘抽象方法
     * @return string
     */
    public abstract String disk();

    @Override
    public String toString() {
        return "内存:" + memory() + "  " + "磁盘:" + disk();
    }
}

华为台式机

/**
 * 华为台式机
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:22
 */
public class HuaWeiPc extends Computer {
    private final String memory;

    private final String disk;

    public HuaWeiPc(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public String disk() {
        return this.disk;
    }
}

小米台式机

/**
 * 小米台式机
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:23
 */
public class XiaoMiPc extends Computer{

    private final String memory;
    private final String disk;

    public  XiaoMiPc(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public String disk() {
        return this.disk;
    }
}

华为笔记本

/**
 * 华为笔记本
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:26
 */
public class HuaWeiLaptop extends Computer{

    private final String memory;
    private final String disk;
    public HuaWeiLaptop(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }
    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public String disk() {
        return this.disk;
    }
}

小米笔记本

/**
 * 小米笔记本
 *
 * @author chenyunzhi
 * @date 2023/12/27 0:30
 */
public class XiaoMiLaptop extends Computer{

    private final String memory;
    private final String disk;

    public XiaoMiLaptop(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public String memory() {
        return this.memory;
    }

    @Override
    public String disk() {
        return this.disk;
    }
}

2.2 定义抽象工厂类和其实现类

电脑抽象工厂

创建一个接口或者抽象类都可以

/**
 * 电脑抽象工厂
 *
 * @author chenyunzhi
 * @date 2023/12/27 22:53
 */
public interface  ComputerAbstractFactory {
    /**
     * 创建华为电脑接口
     */
    public Computer createHuaWeiComputer();

    /**
     * 创建小米电脑接口
     */
    public Computer createXiaoMiComputer();
}

台式机工厂

/**
 * 台式机工厂
 *
 * @author chenyunzhi
 * @date 2023/12/27 21:57
 */
public class PcFactory implements ComputerAbstractFactory{

    private final String memory;

    private final String disk;

    public PcFactory(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public Computer createHuaWeiComputer() {
        return new HuaWeiPc(memory, disk);
    }

    @Override
    public Computer createXiaoMiComputer() {
        return new XiaoMiPc(memory, disk);
    }
}

笔记本工厂

/**
 * 笔记本工厂
 *
 * @author chenyunzhi
 * @date 2023/12/27 23:08
 */
public class LaptopFactory implements ComputerAbstractFactory{

    private final String memory;
    private final String disk;

    public LaptopFactory(String memory, String disk) {
        this.memory = memory;
        this.disk = disk;
    }

    @Override
    public Computer createHuaWeiComputer() {
        return new HuaWeiLaptop(memory, disk);
    }

    @Override
    public Computer createXiaoMiComputer() {
        return new XiaoMiLaptop(memory, disk);
    }
}

2.3 测试

/**
 * 测试
 *
 * @author chenyunzhi
 * @date 2023/12/27 23:25
 */
public class TestDesignPatterns {
    public static void main(String[] args) {
        testDesignPatterns();
    }

    private static void testDesignPatterns() {
        Computer huaWeiComputer = ComputerFactory.getHuaWeiComputer(new PcFactory("32 GB", "1 TB"));
        System.out.println("华为pc电脑 = " + huaWeiComputer);
        Computer xiaoMiComputer = ComputerFactory.getXiaoMiComputer(new PcFactory("16 GB", "512 GB"));
        System.out.println("小米pc电脑 = " + xiaoMiComputer);

        Computer huaWeiComputer1 = ComputerFactory.getHuaWeiComputer(new LaptopFactory("8 GB", "1 TB"));
        System.out.println("华为笔记本电脑 = " + huaWeiComputer1);
        Computer xiaoMiComputer1 = ComputerFactory.getXiaoMiComputer(new LaptopFactory("4 GB", "512 GB"));
        System.out.println("小米笔记本电脑 = " + xiaoMiComputer1);
    }
}

image-20231228001553538

三. 抽象工厂设计模式的好处

  • 抽象工厂模式是“工厂的工厂”,可以很容易地扩展以容纳更多的产品,例如我们可以添加另一个子类 ipad 和工厂 ipadFactory。
  • 抽象工厂模式是健壮的,并且避免了工厂模式的条件逻辑。

四. 抽象工厂模式的案例

  • javax.xml.parsers.DocumentBuilderFactory#newInstance()
  • javax.xml.transform.TransformerFactory#newInstance()
  • javax.xml.xpath.XPathFactory#newInstance()

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。

文章来源:https://blog.csdn.net/weixin_46654114/article/details/135279697
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。