Java 设计模式以虹猫蓝兔的故事讲解简单工厂模式
作者:桃花键神 发布时间:2021-10-19 21:20:08
专栏介绍
本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助!
本期介绍
模式: 简单工厂模式
案例: 一个天外陨石(抽象产品),三把剑(产品),
一个铸剑师(工厂)。
虹猫蓝兔莎莉分别找铸剑师造了三把剑。
什么是简单工厂模式
工厂模式的定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
1、按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
2、我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。
优点
1、工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
2、客户端无需知道所创建具体产品的类名,只需知道参数即可。
3、也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
缺点
1、简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
2、使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
3、系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
4、简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。
应用场景
对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。
简单工厂的实现
案例的主要角色如下:
工厂(SimpleFactory):铸剑师
抽象产品(Product):天外陨石(铸剑的原材料)
具体产品(ConcreteProduct):长虹剑、冰魄剑、紫云剑
案例: 虹猫蓝兔莎莉分别找铸剑师打造三把剑,长虹剑、冰魄剑、紫云剑。铸剑师利用原材料天外陨石来铸造这三把剑。
Ss接口(天外陨石):
接口内声明了一个方法
public interface Ss {
void show();
}
Aa类实现接口Ss(长虹剑):
实现Ss接口
public class Aa implements Ss {
@Override
public void show() {
System.out.println("打造了一把长虹剑");
}
}
Bb类实现接口Ss(冰魄剑):
实现Ss接口
public class Bb implements Ss {
@Override
public void show() {
System.out.println("打造了一把冰魄剑");
}
}
Cc类实现接口Ss(紫云剑):
实现Ss接口
public class Cc implements Ss {
@Override
public void show() {
System.out.println("打造了一把紫云剑");
}
}
Zz类(铸剑师):
声明一个Ss类型属性,声明一个abc方法,用来判断需要造哪把剑,返回一把剑对象。
public class Zz {
private static Ss ss;
public Ss abc(String a) {
if ("长虹剑".equals(a)) {
ss = new Aa();
} else if ("冰魄剑".equals(a)) {
ss = new Bb();
} else if ("紫云剑".equals(a)) {
ss = new Cc();
} else {
System.out.println("铸剑失败");
}
return ss;
}
}
Demo测试类:
new一个铸剑师(工厂对象),调用铸剑师的方法传入需要造的剑,返回一个剑的对象,然后调用剑对象中的方法看看造的对不对。
public class Demo {
public static void main(String[] args) {
Zz zz = new Zz();
Ss aa = zz.abc("长虹剑");
aa.show();
Ss bb = zz.abc("冰魄剑");
bb.show();
Ss cc = zz.abc("紫云剑");
cc.show();
Ss dd = zz.abc("aa");
}
}
下期预告
模式: 普通工厂模式
案例: 七侠找铸剑师夫妇造剑
敬请期待
来源:https://jianshen.blog.csdn.net/article/details/123746505
猜你喜欢
- 前言Webp是Google推出的一种新型图片格式,相比于 传统的PNG/JPG图片有着更小体积的优势,在Web中有着广泛的应用。由于Webp
- 下面一段代码给大家介绍了android 自定义顶部导航栏控件功能,具体代码如下所示:class HeaderBar @JvmOverload
- 看了下网上代码:我想要的效果如下图下划线和文字有15dp的间距 eeeeee的颜色上代码,<"1.0
- BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。在计算机中,BLOB常常是数据库中用来存
- 本文实例为大家分享了Java网络编程TCP程序设计的具体代码,供大家参考,具体内容如下[1] TCP编程的主要步骤客户端(client):1
- 使用DOM4J方式生成XML文件的步骤如下:引入JAR包通过DocumentHelper类的createDocument()创建Docume
- spring profile 多环境配置管理现象 如果在开发时进行一些数据库测试,希望链接到一个测试的数据库,以避免对开发数据
- 简介LinkedBlockingQueue是一个阻塞的有界队列,底层是通过一个个的Node节点形成的链表实现的,链表队列中的头节点是一个空的
- 对于网站的安全性,是每个网站开发者和运营者最关心的问题。网站一旦出现漏洞,那势必将造成很大的损失。为了提高网站的安全性,首先网站要防注入,最
- 先来看看网易新闻客户端以及自己实现的效果图,效果当然还是网易的好gridviewsort.gif如何实现拖拽一个Item用WindowMan
- 近日在研究重构代码的时候有用到idea的不少插件,比如CheckStyle,同时下载了阿里的开发规约,受到不少启发。规约中会要求所有的方法都
- 目录1、在运行时,由java解释器自动引入,而不用import语句引入的包是()。2、以下关于集合类ArrayList、LinkedList
- 单行文本的输入存在严重的缺陷,也不适合实际的运用,本节通过一个无功能的记事本来介绍可以进行多行输入的JTextArea:JTextArea(
- 使用filter设置要排除的URL@WebFilter(urlPatterns = "/*")@Order(value
- 首先微信公众号开发网页授权登录使用环境:开发工具:eclipse;服务器:tomcat8,开发语言:JAVA。我写的网页授权登录时用开发者模
- Java继承方法重写是Java语言多态的特性,必须满足以下条件在子类中,方法名称与父类方法名称完全相同方法的参数个数和类型完全相同,返回类型
- 各个方法1. 得到class的成员变量首先得到object的class对象然后在class对象中用getDeclaredFields()方法
- 实现HandlerInterceptor接口或者继承HandlerInterceptor的子类,比如Spring 已经提供的实现了Handl
- 1.XxlJob简介官方网址:https://www.xuxueli.com/xxl-jobXXL-JOB是一个分布式任务调度平台,其核心设
- 本文实例为大家分享了SpringMVC按Ctrl上传多个文件的具体实现代码,供大家参考,具体内容如下JSP页面注意:必须加入multiple