一:工厂方法模式

1.概念

工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。

工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

模式结构:

抽象工厂(ExportFactory)角色:担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类                                                                实现。

具体工厂(ExportHtmlFactory、ExportPdfFactory)角色:担任这个角色的是实现了抽象工厂接口的具体JAVA类。具体工厂角色含有与业务密切相关的逻辑,并且受到使用者                                                                                                          的调用以创建导出类(如:ExportStandardHtmlFile)。

抽象导出(ExportFile)角色:工厂方法模式所创建的对象的超类,也就是所有导出类的共同父类或共同拥有的接口。在实际的系统中, 这个角色也常常使用抽象类实现。

具体导出(ExportStandardHtmlFile等)角色:这个角色实现了抽象导出(ExportFile)角色所声明的接口,工厂方法模式所创建的每一

个对象都是某个具体导出角色的实例。

二:模式案例

package com.cloud.factory2;

public class MainTest {

public static void main(String[] args) {

FruitGardener fg=new AppleGardener();

fg.factory().harvest();

}

}

//水果园林

interface FruitGardener{

public Fruit factory();

}

//Apple园林

class AppleGardener implements FruitGardener{

public Fruit factory() {

return new Apple();

}

}

//StrawBerray园林

class StrawBerrayGardener implements FruitGardener{

public Fruit factory() {

return new Strawberray();

}

}

//Grape园林

class GrapeGardener implements FruitGardener{

public Fruit factory() {

return new Grape();

}

}

interface Fruit{

void plant();

void grow();

void harvest();

}

//Apple类

class Apple implements Fruit{

private int treeAge;

public void plant() {

log("种植苹果");

}

public void grow() {

log("苹果生长");

}

public void harvest() {

log("收获苹果");

}

public static void log(String msg){

System.out.println(msg);

}

public int getTreeAge() {

return treeAge;

}

public void setTreeAge(int treeAge) {

this.treeAge = treeAge;

}

}

//Grape类

class Grape implements Fruit{

//区分葡萄是否有籽

private boolean sendless;

public void plant() {

log("种植葡萄");

}

public void grow() {

log("葡萄生长");

}

public void harvest() {

log("收获葡萄");

}

public static void log(String msg){

System.out.println(msg);

}

public boolean isSendless() {

return sendless;

}

public void setSendless(boolean sendless) {

this.sendless = sendless;

}

}

//Strawberray类

class Strawberray implements Fruit{

public void plant() {

log("种植草莓");

}

public void grow() {

log("草莓生长");

}

public void harvest() {

log("收获草莓");

}

public static void log(String msg){

System.out.println(msg);

}

}

三:工厂方法模式和简单工厂模式   工厂方法模式和简单工厂模式在结构上的不同很明显。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。   工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么不妨把抽象工厂类合并到具体工厂类中去。由于只有一个具体工厂类,所以不妨将工厂方法改为静态方法,这时候就得到了简单工厂模式。   如果系统需要加入一个新的导出类型,那么所需要的就是向系统中加入一个这个导出类以及所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的导出类型而言,这个系统完全支持“开-闭原则”。

java工厂方法模式记录日志_java工厂方法模式相关推荐

  1. java在工厂自动化的应用_java 工厂的变形模拟的各种应用

    工厂模式是在项目开发中使用效率高,意一个接口,该定义用于创建对象.让子类来决定哪一个类实例. 这就是一个工厂类的示意图 接着来一个简单的样例: 如上图所看到的,我们首先定义我们的产品抽象类接口,也能够 ...

  2. java方法命名规则_java中方法的命名规范

    java中方法的命名规范 发布时间:2020-06-25 19:52:51 来源:亿速云 阅读:167 作者:Leah 这期内容当中小编将会给大家带来有关java中方法的命名规范,文章内容丰富且以专业 ...

  3. java 方法名相同_Java的方法的重载 :方法名相同,参数类型不同 - Break易站

    人类设计语言时,相同的词汇可以表达多种意思.而在Java里面,方法也被设计成这个模式,而区分这些相同方法名的就是方法的参数. Java的方法的重载的特点 方法的重载有下面的特点: 1. 方法名相同,参 ...

  4. java对于数组的定义_Java中方法的定义与使用,以及对数组的初步了解。

    方法 方法的含义 定义: 方法就是用来完成解决某件事情或实现某个功能的办法. 方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值. 我们可以通过在程序代码 ...

  5. java调用其他程序吗_java本地方法如何调用其他程序函数,方法详解

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.从Java 1.1 开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许J ...

  6. java的sort的用法_Java排序方法sort用法详解

    Java排序方法sort用法详解 发布于 2020-2-28| 复制链接 摘记: 本文实例为大家分享了java对数组.集合的排序方法,供大家参考,具体内容如下对数组的排序: ```java //对数组 ...

  7. java中介者模式例子_Java中介者模式(Mediator Pattern)

    本篇文章帮大家学习java中介者模式(Mediator Pattern),包含了Java中介者模式(Mediator Pattern)使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以 ...

  8. java策略设计模式输出字母_Java 设计模式-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern)属于对象行为模式.其作用是针对一组算法,将每个算法封装到具有共同接口的独立类中,从而使它们可以相互替换. 策略模式的意图是将可以互换的方法封装在各自的对立类 ...

  9. java方法的传递方式_JAVA基础--方法传参

    JAVA基础--方法传参 为啥拿这个当话题? 在初学者阶段,许多童鞋都对方法传参比较迷茫,知其然不知其所以然. 一.先说说参数传递的几个术语: 值调用(call by vale):表示方法接收的是调用 ...

最新文章

  1. 什么是布隆过滤器?如何解决高并发缓存穿透问题?
  2. 多行显示的UIButton
  3. cmd静默运行_【已解决】BAT批处理中如何静默执行,在完成后调用MSGBOX?
  4. Linux 下hosts文件详解
  5. dart服务器开发性能,DartVM服务器开发(第四天)--代码优化
  6. 一文了解类别型特征的编码方法
  7. node.js更新升级(Mac与Windows)- 总结篇
  8. 聊聊四种Oracle数字取整函数
  9. Linux进程管理:上帝视角看进程调度
  10. jq获取页面url后边带的参数
  11. 提高电脑反应速度_如何组装一台4000元左右的台式电脑?
  12. 睡眠分期中的各种特征
  13. 电动牙刷无线充电解决方案
  14. SPSS如何验证是否符合正态分布
  15. E/art﹕Failed sending reply to debugger: Broken pipe的解决方法
  16. 咸鱼Maya笔记—NURBS放样成型法
  17. 芯片读取设备详解+U盘芯片flash读取分析实录_一篇看够
  18. 成功解决Win10连接上wifi但是却显示“无Internet,安全”
  19. android编译集成dialer应用,Comet Android Dialer
  20. 美国陆军正在考虑建立人工智能任务组

热门文章

  1. python编写英文字典_python如何制作英文字典
  2. 小红书榜单,五大行业图文笔记类
  3. Invalid Host/Origin header vue项目
  4. Vue对高德地图2.0的封装使用
  5. 真实骑手数据:73万大学毕业生在送外卖?
  6. eclipse启动失败,提示“发生了错误,请参阅日志文件.log
  7. 华为cor—al10_华为荣耀cor_al10是 什么型号的手机
  8. android平台开发板外接罗技C525摄像头不支持扫码有什么办法解决
  9. 快速制作一个chrome插件
  10. 入门了解开发板是做什么用的?