工厂方法模式

  工厂方法模式,对简单工厂模式进行了升级。我们将水果园比作一个工厂,在简单工厂模式下,水果园是一个具体的工厂,直接用来生产各种各样的水果。那么在工厂方法模式下,水果园是一个抽象工厂,那么苹果树,香蕉树等就相当于是具体工厂,生产苹果、香蕉等水果。每有一种新的水果要生产,则需要种植生产这种水果植物,即创建生产具体水果的工厂。

1.相关术语

  • 抽象工厂:工厂方法模式的核心,任何的工厂类需实现这个接口

  • 具体工厂:实现抽象的工厂接口,生产产品,即实例化相应的对象

2.工厂方法模式示意图

  这里苹果和香蕉的都实现水果接口类中的get()方法,负责生产苹果和香蕉的具体工厂实现水果这个抽象工厂接口。在工厂方法模式下如果想要生产新的水果,即创建新的类。比如生产梨子,需要新建一个梨子类实现水果类的get()方法,创建梨子工厂实现水果工厂来生产梨子。

3.创建Fruit接口、Apple类等

Fruit(interface):

//水果类
public interface Fruit {
public void get();
}

Apple类:

//苹果类
public class Apple implements Fruit{
//实现并重写父类的get()方法
public void get() {
System.out.println("采集苹果");
}
}

4.创建FruitFactory接口、AppleFactory类等

FruitFactory(interface):

public interface FruitFactory {
public Fruit getFruit();
}

AppleFactory类:

public class AppleFactory implements FruitFactory {
@Override
public Fruit getFruit() {
return new Apple();
}
}

5.生产水果

MainClass:

public class MainClass {
public static void main(String[] args){
//创建苹果工厂
FruitFactory appleFactory = new AppleFactory();
//通过苹果工厂生产苹果实例
Fruit apple = appleFactory.getFruit();
apple.get(); //创建香蕉工厂
FruitFactory bananaFactory = new BananaFactory();
//通过香蕉工厂生产香蕉实例
Fruit banana = bananaFactory.getFruit();
banana.get(); //新添加的梨子工厂
FruitFactory pearFactory = new PearFactory();
Fruit pear = pearFactory.getFruit();
pear.get();
}
}

  这里用到Java面向对象的三大特性之一--多态。在新建工厂时,由FruitFactory接口指向具体的工厂(AppleFactory)。通过具体的工厂生产水果时,由Fruit接口指向具体的实例对象(Apple)。

6.结果

7.总结

  模式来源于生活。工厂方法模式,在简单工厂模式的基础上,对工厂类进行抽象,产生一个抽象工厂接口,将实际创建工作推迟到子类当中。在简单工厂模式下新引进的产品需要修改核心工厂,在工厂方法模式下不需要修改核心工厂,只需要新建一个类和创建该类的具体工厂,扩展性较强。

  参考B站视频https://www.bilibili.com/video/av34162848

工厂方法模式--java代码实现的更多相关文章

  1. 设计模式之第1章-工厂方法模式(Java实现)

    设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...

  2. 工厂方法模式(JAVA反射)

    简单工厂模式的不足     在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类.简单工厂模式最大的缺点是当有新 ...

  3. 设计模式之工厂方法模式(代码用Objective-C展示)

    前面一篇展示了一个简单工厂模式,这一篇主要是对比,工厂方法模式比简单工厂模式好在哪里?为什么要用这个模式?这个模式的精髓在哪里? 就以计算器为例,结果图如下: 加减乘除运算都是继承自基类运算类,然后工 ...

  4. 设计模式之工厂方法模式(Java实现)

    “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~).“抽象工厂模式,赶紧的自我介绍,工厂方法模式 ...

  5. FactoryMethodPattern(工厂方法模式)-----Java/.Net

    也就是工厂方法(FactoryMethod)模式允许将产品类的实例化推迟到具体的创建者子类,由创建者子类决定实例化哪一个产品类.我们同样以汽车的生产作为讲解该模式的例子,因为汽车生产从宏观上来说也是特 ...

  6. Java设计模式(二) 工厂方法模式

    本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...

  7. IOS设计模式浅析之工厂方法模式(Factory Method)

    概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口. 如何隔离出这个易变对象的变化,使得系统中“其它依赖该对象的对 ...

  8. C#设计模式之二工厂方法模式(Factory Method Pattern)【创建型】

    一.引言 在上一篇文章中我们讲解了过渡的一种模式叫做[简单工厂],也有叫[静态工厂]的,通过对简单工厂模式得了解,我们也发现了它的缺点,就是随着需求的变化我们要不停地修改工厂里面的方法的代码,需求变化 ...

  9. C#设计模式--工厂方法模式

    0.C#设计模式-简单工厂模式 设计模式: 工厂方法模式(Factory Method Pattern) 介绍:简单工厂模式是要在工厂类中通过数据来做个决策,在工厂类中的多个类中实例化出来其中一个要用 ...

随机推荐

  1. 爬虫之urllib.error模块

    error模块简介 我们在爬虫的时候发请求的时候难免出现错误,如访问不到服务器或者访问被禁止等等, 出错了之后urllib将错误信息封装成了一个模块对象中,这个模块就叫error模块 error的分类 ...

  2. CSS样式渐变代码,兼容IE8

    background: -webkit-linear-gradient(top,#ffffff,#f5f5f5); background: -moz-linear-gradient(top,#ffff ...

  3. ArcCore重构-目标文件结构化

    基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5   基本问题 3. 编译系统中所有代码文件通过搜索路径(VPATH)中搜索,存在名称污染问题,需加入路径信息:   ...

  4. Prime 算法的简述

    前面在介绍并查集时顺便提了Kruskal算法,既然已经说到了最小生成树问题,就没有道理不把Prime算法说了. 这里面先补充下Kruskal算法的大概意思,Kruskal算法通过把所有的边从小到大排列 ...

  5. 用户注册登录系统 V2.0

    # 准备空列表 users = [] # 准备当前在线用户 online_user = {} while True: # 打印系统提示 print("欢迎使用 用户注册登录系统V2.0&qu ...

  6. 重载new和delete来检测内存泄漏

    重载new和delete来检测内存泄漏 1. 简述 内存泄漏属于资源泄漏的一种,百度百科将内存泄漏分为四种:常发性内存泄漏.偶发性内存泄漏.一次性内存泄漏和隐式内存泄漏.    常发性指:内存泄漏的代 ...

  7. 用Django做一个团队介绍

    所用工具 Pycharm 社区版 Django 2.x Python 3.6.4 总目录 settings中的设置 总的路由设置 templates中的index.html文件 <!DOCTYP ...

  8. Flask信号和wtforms

    一.信号 1.1.所有内置信号 request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _s ...

  9. Python_ jiba、snownlp中文分词、pypinyin中文转拼音

    import jieba #导入jieba模块 x = '分词的准确度直接影响了后续文本处理和挖掘算法的最终效果.' jieba.cut(x) #使用默认词库进行分词 print(list(jieba ...

  10. java定时任务调度-Timer(1)

    一.定义 有且仅有一个后台线程对多个业务线程进行定时定频率的调度 二. Timer  ---->  Timer Task  (中有run();方法) 通过 new Timer().schedul ...