工厂模式

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

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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 设计模式

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

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

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖 • 2 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 2 关注
  • Solo

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

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

    1434 引用 • 10054 回帖 • 489 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    190 引用 • 1057 回帖
  • Pipe

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

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

    132 引用 • 1114 回帖 • 124 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 733 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 2 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 355 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 9 关注
  • 友情链接

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

    24 引用 • 373 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 589 关注
  • Node.js

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

    139 引用 • 269 回帖 • 43 关注
  • ReactiveX

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

    1 引用 • 2 回帖 • 156 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 633 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    286 引用 • 729 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • SVN

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

    29 引用 • 98 回帖 • 683 关注
  • Kubernetes

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

    110 引用 • 54 回帖
  • 996
    13 引用 • 200 回帖 • 6 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    6 引用 • 63 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 304 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    266 引用 • 665 回帖 • 1 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 212 关注
  • SOHO

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

    7 引用 • 55 回帖 • 17 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 585 关注
  • 笔记

    好记性不如烂笔头。

    308 引用 • 793 回帖