工厂模式

本贴最后更新于 1033 天前,其中的信息可能已经事过境迁

1.工厂模式

工厂模式根据传递的参数来决定生产的产品,增加产品需要改动工厂的的代码,在明确不同条件生产不同实例的情况下可以使用这个模式(一般这个模式可以应付大多数场景了)

image.png

代码

手机接口:

public interface Phone {
    void phoneInfo();
}

华为手机

public class Huawei implements Phone {

    @Override
    public void phoneInfo() {
        System.out.println("我是华为手机");
    }
}

小米手机

public class Xiaomi implements Phone {

    @Override
    public void phoneInfo() {
        System.out.println("我是小米手机");
    }
}

生产工厂,在工厂中,根据不同的类型,生成不同的手机

public class PhoneFactory {
    public Phone createPhone(String type){
        Phone product =null;
        switch (type){
            case "huawei":
                product = new Huawei();
                break;
            case "xiaomi":
                product = new Xiaomi();
                break;
        }
        return product;
    }
}

测试工厂方法

public class CreatePhone {
    public static void main(String[] args){
        PhoneFactory factory = new PhoneFactory();
        Phone huawei = factory.createPhone("huawei");
        huawei.phoneInfo();
        Phone xiaomi = factory.createPhone("xiaomi");
        xiaomi.phoneInfo();
    }
}

测试结果

image.png

2.抽象工厂模式

抽象工厂模式解决了工厂模式增加产品需要修改工厂代码的问题,其实就是对工厂也进行抽象,得到一个生产工厂的工厂,在具体的工厂中,可以增加产品,每个工厂也是一个产品簇,这样符合开闭原则,功能扩展性强,但是产品簇的扩展比原来难

image.png

代码信息

手机接口

public interface Phone {
    void phoneInfo();
}

华为手机

public class HuaweiPC implements PC {
    @Override
    public void pcInfo() {
        System.out.println("我是华为电脑");
    }
}

小米手机

public class XiaomiPhone implements Phone {
    @Override
    public void phoneInfo() {
        System.out.println("我是小米手机!");
    }
}

电脑信息

电脑接口

public interface PC {
    void pcInfo();
}

华为电脑

public class HuaweiPC implements PC {
    @Override
    public void pcInfo() {
        System.out.println("我是华为电脑");
    }
}

小米电脑

public class XiaomiPC implements PC {
    @Override
    public void pcInfo() {
        System.out.println("我是小米电脑");
    }
}

工厂信息

抽象工厂

public interface ProductFactory {
    Phone createPhone();
    PC createPC();
}

华为工厂生产华为手机和华为电脑

public class HuaweiFactory implements ProductFactory {
    @Override
    public Phone createPhone() {
        return new HuaweiPhone();
    }

    @Override
    public PC createPC() {
        return new HuaweiPC();
    }
}

小米工厂生产小米手机和小米电脑

public class XiaomiFactory implements ProductFactory {
    @Override
    public Phone createPhone() {
        return new XiaomiPhone();
    }

    @Override
    public PC createPC() {
        return new XiaomiPC();
    }
}

盗版工厂生产华为手机和小米电脑

public class PiracyFactory implements ProductFactory {
    @Override
    public Phone createPhone() {
        System.out.println("盗版商家--");
        return new HuaweiPhone();
    }

    @Override
    public PC createPC() {
        System.out.println("盗版商家--");
        return new XiaomiPC();
    }
}

测试生产

public class CreateProduct {
    public static void main(String[] args){
        ProductFactory xiaomiFactory = new XiaomiFactory();
        ProductFactory huaweiFactory = new HuaweiFactory();
        ProductFactory piracyFactory = new PiracyFactory();
        xiaomiFactory.createPhone().phoneInfo();
        xiaomiFactory.createPC().pcInfo();
        huaweiFactory.createPhone().phoneInfo();
        huaweiFactory.createPC().pcInfo();
        piracyFactory.createPhone().phoneInfo();
        piracyFactory.createPC().pcInfo();
    }
}

结果

image.png

  • 开发
    38 引用 • 159 回帖 • 2 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3170 引用 • 8209 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    198 引用 • 120 回帖
1 操作
wenyl 在 2021-12-02 09:56:10 更新了该帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 268 回帖 • 73 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1433 引用 • 10052 回帖 • 484 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 114 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    11 引用 • 5 回帖 • 597 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    207 引用 • 358 回帖
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 1 关注
  • CodeMirror
    1 引用 • 2 回帖 • 131 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 30 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 152 关注
  • gRpc
    11 引用 • 9 回帖 • 54 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 4 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 1 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    76 引用 • 429 回帖 • 1 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 693 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 383 回帖
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 17 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    165 引用 • 594 回帖
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    54 引用 • 85 回帖 • 5 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 133 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    110 引用 • 54 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 539 关注