当前位置: 首页 > news >正文

设计模式 工厂方法模式

目录

1 工厂方法模式介绍

2 代码

3 说明


1 工厂方法模式介绍

又称工厂模式

是一种创建型设计模式
是对简单工厂模式的进一步抽象化(简单工厂模式违背了开闭原则)
工厂方法模式可以使系统在不修改原来代码的情况下,引进新的的产品。(满足开闭原则)

简单工厂模式请点这里

设计原则请点这里

优点:


1 用户只需要知道具体工厂的名称就可以得到所要的产品,无须知道产品的创建过程。
2 灵活性增强。对于新产品的创建,只需多写一个相应的工厂类。
3 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点:

1 类的个数容易过多,增加复杂度。
2 增加了系统的抽象性和理解难度。
3 抽象产品只能生产一种产品(此弊端可以使用抽象工厂模式解决)

2 代码

package com.qing.factoryMethod;

public abstract class Animal {
    abstract void show();
}
package com.qing.factoryMethod;

public class Cat extends Animal {
    @Override
    void show() {
        System.out.println("show cat");
    }
}
package com.qing.factoryMethod;

public class Dog extends Animal {
    @Override
    void show() {
        System.out.println("show dog");
    }
}

 和简单工厂不同之处:

package com.qing.factoryMethod;

public interface IFactory {
    Animal createAnimal();
}
package com.qing.factoryMethod;

public class CatFactory implements IFactory {
    @Override
    public Animal createAnimal() {
        return new Cat();
    }
}
package com.qing.factoryMethod;

public class DogFactory implements IFactory {
    @Override
    public Animal createAnimal() {
        return new Dog();
    }
}

测试

package com.qing.factoryMethod;

public class Test1 {
    public static void main(String[] args) {
        IFactory catFactory = new CatFactory();
        catFactory.createAnimal().show();
        IFactory dogFactory = new DogFactory();
        dogFactory.createAnimal().show();
    }
}

3 说明

工厂方法实现时,选择判断的问题还是存在。

简单工厂的选择判断在工厂里进行,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来执行。

想要加功能,本来是改工厂类的,而现在是修改客户端。

简单工厂模式请点这里

如下,简单工厂的选择判断在工厂里进行,当使用工厂方法实现时,如下简单工厂的逻辑判断移到了客户端。

 

相关文章:

  • 自动控制原理7.3---z变换理论
  • 基于ISO14229协议的安全访问系列_1
  • 自动控制原理7.4---离散系统的数学模型
  • 【ELFK】之zookeeper
  • ALTERA FPGA IPCORE核之FIFO详细教程
  • 【ELK】日志分析系统概述及部署
  • MyBatis一对多查询,MyBatis中resultMap的使用,MyBatis中collection注意事项,MyBatis的级联搜索
  • STC15单片机-RS-485通信
  • 【JAVA-1】JDK、JRE安装及卸载,有手就会!
  • Python 操作MySql数据库(封装、优雅)
  • 《蓝海战略》让你竞争中获得优势
  • RequestMapping注解
  • 实战Spring Boot集成quartz任务调度框架
  • 神经网络深度学习(五)初始化
  • jvm虚拟机学习一class文件
  • [NodeJS] 关于Buffer
  • 2018一半小结一波
  • ES10 特性的完整指南
  • HashMap ConcurrentHashMap
  • nginx 配置多 域名 + 多 https
  • oldjun 检测网站的经验
  • Redis中的lru算法实现
  • 编写高质量JavaScript代码之并发
  • 山寨一个 Promise
  • 深入 Nginx 之配置篇
  • 世界上最简单的无等待算法(getAndIncrement)
  • 数组大概知多少
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • #HarmonyOS:基础语法
  • (007)XHTML文档之标题——h1~h6
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4)logging(日志模块)
  • (C++)八皇后问题
  • (LeetCode 49)Anagrams
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (差分)胡桃爱原石
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (五)MySQL的备份及恢复
  • (一)appium-desktop定位元素原理
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .gitignore文件—git忽略文件
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CLR基本术语
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net Stream篇(六)
  • .net 获取url的方法
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • @html.ActionLink的几种参数格式
  • @requestBody写与不写的情况
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [AIGC] Java 和 Kotlin 的区别