java23种设计模式(一)工厂方法模式
在说工厂方法模式之前,先了解一下简单工厂模式。工厂方法模式其实是在简单工厂上面做了一些增强。
简单工厂模式:有一个专门的类来生产其他类的实例,生产的这些实例有一个共同父类。这个跟我们的多态有一点像。
例子:
假如我们有一个鼠标工厂,这个工厂既可以生产联想鼠标,又可以生产宏碁鼠标。
代码如下:
1、鼠标工厂(可以生产联想鼠标和宏碁鼠标)
public class MouseFactory {
/**
* 生产一个鼠标
* @param i
* @return
*/
public Mouse createMouse(int i){
Mouse mouse = null;
switch (i){
case 1:
mouse = new LenovoMouse();
break;
case 2:
mouse = new AcerMouse();
break;
}
return mouse;
}
}
2、鼠标接口(有一个getName()的方法)
public interface Mouse {
void getName();
}
3、联想鼠标实现类(实现鼠标接口,可以生产联想鼠标)
public class LenovoMouse implements Mouse {
@Override
public void getName() {
System.out.println("这个是联想鼠标");
}
}
4、宏碁鼠标实现类(实现鼠标接口,可以生产宏碁鼠标)
public class AcerMouse implements Mouse {
@Override
public void getName() {
System.out.println("这个是宏碁鼠标");
}
}
5、客户端(需要鼠标的人,可以买联想鼠标也可以买宏碁鼠标)
@SpringBootTest
class FactoryApplicationTests {
@Test
void contextLoads() {
MouseFactory factory = new MouseFactory();
Mouse mouse = factory.createMouse(2);
mouse.getName();
}
这样简单工厂就算实现了,可以传入1和2让工厂分别生成联想鼠标和宏碁鼠标。
接下来我们在简单工厂的基础上看看工厂方法模式。
工厂方法模式:定义一个专门生产其他类实例的接口,让子类决定具体生产哪个类的实例。
例子:
有一个鼠标工厂开了两个子公司,一个是联想鼠标工厂用来专门生产联想鼠标,另一个是宏碁鼠标工厂用来专门生产宏碁鼠标。
代码如下:
1、鼠标工厂接口:
public interface MouseFactory {
Mouse createMouse();
}
2、联想鼠标工厂(用来生产联想鼠标)
public class LenovoMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new LenovoMouse();
}
}
3、宏碁鼠标工厂(用来生产宏碁鼠标)
public class AcerMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new AcerMouse();
}
}
鼠标类跟简单工厂一样,复制如下:
4、鼠标接口(有一个getName()的方法)
public interface Mouse {
void getName();
}
5、联想鼠标实现类(实现鼠标接口,可以生产联想鼠标)
public class LenovoMouse implements Mouse {
@Override
public void getName() {
System.out.println("这个是联想鼠标");
}
}
6、宏碁鼠标实现类(实现鼠标接口,可以生产宏碁鼠标)
public class AcerMouse implements Mouse {
@Override
public void getName() {
System.out.println("这个是宏碁鼠标");
}
}
7、客户端(需要鼠标的人,可以买联想鼠标也可以买宏碁鼠标)
@SpringBootTest
class FactoryApplicationTests {
@Test
void demo(){
LenovoMouseFactory lenovoMouseFactory = new LenovoMouseFactory();
Mouse lenovoMouse = lenovoMouseFactory.createMouse();
lenovoMouse.getName();
AcerMouseFactory acerMouseFactory = new AcerMouseFactory();
Mouse acerMouse = acerMouseFactory.createMouse();
acerMouse.getName();
}
}
我们可以通过不同的工厂来获取不同实例,假如我们想买一个联想鼠标,则去联想工厂买。想买宏碁鼠标,则去宏碁工厂买。
这样,我们就实现了工厂方法模式,假如我们想要一个华硕鼠标,则建一个华硕工厂去生产华硕鼠标即可。
如果文章对您有帮助,请记得点赞关注哟~
欢迎大家关注我的公众号<情系IT>,每日技术推送文章供大家学习参考。
java23种设计模式(一)工厂方法模式的更多相关文章
- java23种设计模式之八: 工厂方法模式
定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的“创建与使用相分离”的特点. 我们把被创建的对象称为“产品”,把创建产品的对象称为“工 ...
- 【Unity3D与23种设计模式】工厂方法模式(Factory Method)
GoF中定义: "定义一个可以产生对象的接口,但是让子类决定要产生哪一个类的对象.工厂方法模式让类的实例化程序延迟到子类中实施" 当类的对象产生时,若出现下列情况: 1.需要复杂的 ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- java23种设计模式——四、原型模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- java23种设计模式——八、组合模式
目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...
- java23种设计模式——七、桥接模式
原文地址:https://www.cnblogs.com/chenssy/p/3317866.html 源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 j ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
- C#设计模式(3)——工厂方法模式(转)
C#设计模式(3)——工厂方法模式 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
随机推荐
- 一键升级所有pip过期库
import pipfrom subprocess import callfrom pip._internal.utils.misc import get_installed_distribution ...
- Can't connect to MySQL server on 'localhost' (10038)
平台:win7 已经安装好数据库,但是 在连接MySQL数据库时发生问题: 经过一系列的资料查找后,得到结论MySQL没有启动 解决方法: 将MySQL加入到Windows的服务中.切换到MySQL安 ...
- idea取消大小写自动提示
file-settings 取消勾选Match case
- 手机端特有的meta标签有哪些?
3.1 meta 语法 定义和用法:name 属性把 content 属性连接到 name. 语法:name=author|description|keywords|generator|revised ...
- 松软科技课堂:SQL之NOTNULL约束
SQL NOT NULL 约束 NOT NULL 约束强制列不接受 NULL 值. NOT NULL 约束强制字段始终包含值.这意味着,如果不向字段添加值,就无法插入新记录或者更新记录. 下面的 SQ ...
- Java第二次作业第四题
文本行输入学生姓名,下来框选择课程名称,文本行输入课程成绩:点击"录入"按钮,相关信息显示在文本区:点击"统计"按钮,将所有录入的成绩的平均成绩显示在另一个文本 ...
- SpringBoot整合redis缓存(一)
准备工作 1.Linux系统 2.安装redis(也可以安装docker,然后再docker中装redis,本文章就直接用Linux安装redis做演示) redis下载地址: 修改redis,开启远 ...
- JavaScript之深入对象(二)
上一篇随笔讲解了构造函数.原型及原型链相关的知识,今天让我们一起来探讨另一个问题:this. 一 this 的指向 1, 函数预编译过程中,this指向window 我们在讲解函数预编译过程 ...
- 使用Spreadsheet导出表格时,设置样式
$spreadsheet = new Spreadsheet();// 初始化 $spreadsheet->createSheet();// 添加一个sheet ...
- 【Django】一对多表结构
1.创建project数据库表 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.co ...