在说工厂方法模式之前,先了解一下简单工厂模式。工厂方法模式其实是在简单工厂上面做了一些增强。

简单工厂模式:有一个专门的类来生产其他类的实例,生产的这些实例有一个共同父类。这个跟我们的多态有一点像。

例子:

假如我们有一个鼠标工厂,这个工厂既可以生产联想鼠标,又可以生产宏碁鼠标。

代码如下:

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种设计模式(一)工厂方法模式的更多相关文章

  1. java23种设计模式之八: 工厂方法模式

    定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的“创建与使用相分离”的特点. 我们把被创建的对象称为“产品”,把创建产品的对象称为“工 ...

  2. 【Unity3D与23种设计模式】工厂方法模式(Factory Method)

    GoF中定义: "定义一个可以产生对象的接口,但是让子类决定要产生哪一个类的对象.工厂方法模式让类的实例化程序延迟到子类中实施" 当类的对象产生时,若出现下列情况: 1.需要复杂的 ...

  3. 二十四种设计模式:工厂方法模式(Factory Method Pattern)

    工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...

  4. java23种设计模式——四、原型模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

  5. java23种设计模式——八、组合模式

    目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模式 java23种设计模式-- ...

  6. java23种设计模式——七、桥接模式

    原文地址:https://www.cnblogs.com/chenssy/p/3317866.html 源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 j ...

  7. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  8. C#设计模式(3)——工厂方法模式(转)

    C#设计模式(3)——工厂方法模式   一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...

  9. java23种设计模式——五、建造者模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

  10. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

随机推荐

  1. Runtime.getRuntime().exec()实现Java调用python程序

    使用Runtime.getRuntime().exec()来实现Java调用python,调用代码如下所示: import java.io.BufferedReader; import java.io ...

  2. Python初步接触与学习

    Python的发展史与特点 诞生与发展史 1989,为了度过圣诞假期,Guido开始编写Python语言编译器.Python这个名字来自Guido的喜爱的电视连续剧<蒙蒂蟒蛇的飞行马戏团> ...

  3. 爬取凤凰网站财经类的新闻,函数时编程,可全部实现,由于内容量大,需要时间太长,服务器会禁止,为了防止,可以将time.sleep()设置的时间长点

    import requests from selenium import webdriver import time def grasp(urlT): driver = webdriver.Chrom ...

  4. 玩转 SpringBoot 2 快速整合 | FreeMarker篇

    FreeMarker 介绍 Apache FreeMarker™是一个模板引擎:一个Java库,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等).模板是用FreeMar ...

  5. 为git创建远程仓库

    首先生成ssh公钥: 将公钥添加到git: 测试秘钥是否通过: 然后就可以到web界面看到标注的地方被绿了: 但是我的没有绿,不知道为啥,难道没有女朋友的原因吗? rm -rf .ssh 重来好几遍都 ...

  6. 基于ViewPager与TabLayout建立三类图表

      延续昨天,今天使用ViewPager和TabLayout来实战一下,顺便补充一下新知识:   1.线形图,显示一周的温度情况.   2.饼状图,2017年互联网教育细分领域投资情况.   3.柱状 ...

  7. IBM MQ reason code list

    The reason code parameter (Reason) is a qualification to the completion code parameter (CompCode). I ...

  8. 06: RGB、YUV和HSV颜色空间模型

    RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间 YUV:Y"表示明亮度(Luminance或Luma),也就是灰阶值:而"U"和&q ...

  9. 第八届蓝桥杯java b组第三题

    标题:承压计算 X星球的高科技实验室中整齐地堆放着某批珍贵金属原料. 每块金属原料的外形.尺寸完全一致,但重量不同.金属材料被严格地堆放成金字塔形. 7                         ...

  10. 机器学习之SVM调参实例

    一.任务 这次我们将了解在机器学习中支持向量机的使用方法以及一些参数的调整.支持向量机的基本原理就是将低维不可分问题转换为高维可分问题,在前面的博客具体介绍过了,这里就不再介绍了. 首先导入相关标准库 ...