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

举报
神的孩子在歌唱 发表于 2024/05/28 10:27:14 2024/05/28
【摘要】 抽象工厂设计模式前言这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱抽象工厂设计模式是创建模式之一。抽象工厂模式 几乎与 工厂模式 相似,只是它更像工厂的工厂。一. 简介看本片文章前,可以先看 工厂设计模式,您会注意到我们有一个 Factory 类。该工厂类根据提供的输入返回不同的子类,工厂类使用 if-else 或 switch 语句来实...

抽象工厂设计模式


前言

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


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

一. 简介

看本片文章前,可以先看 工厂设计模式,您会注意到我们有一个 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

转载说明:务必注明来源,附带本人博客连接。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。