不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学。

前言

工厂方法模式是简单工厂模式的延伸,它继承了简单工厂方法模式的优点,同时还弥补了简单工厂方法模式的不足,

工厂方法模式是使用频率最高的设计模式之一,是很多开源框架API类库的核心模式

工厂方法模式的定义(Factory Method Pattern)

定义一个用户创建对象的接口,让子类决定将哪一个类实例化,工厂方法模式让一个类的实例化延迟到其子类,工厂方法模式又被称为工厂模式(Factory Pattern),有可以称为虚拟构造器模式(Virtual Constructor Pattern)或者多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是一种类创建型模式

工厂方法模式的优点

(1)、在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还隐藏了那个具体产品类将被实例化这一个实现细节,用户只需要关注所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名

(2)、基于工厂角色和产品角色的多态性设计是工厂模式的关键,它能让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂的内部,工厂方法模式又被称之为多态工厂模式,正是因为所有的具体工厂类都具有同一个抽象父类

(3)、工厂方法模式最大的优势在于系统新增产品时,无须修改抽象工厂和抽象产品提供的接口,只需要加上一个具体产品和对应的工厂即可,这样子系统的扩展性也非常的好,完全符合了开闭原则

工厂方法模式的缺点

(1)、新增产品时,除了编写新的具体产品类,还需要提供与之相对应的具体工厂类,这样一定程度上增加了系统的复杂程度,有更多的类需要编译和运行,会给系统带来一些额外开销

(2)、考虑到系统的可扩展性,会引入抽象层,在客户端代码中皆使用抽象层定义,会增加系统的抽象性和理解难度,且在实现的时候可能需要用到DOM,反射技术,增加了系统的实现难度

工厂方法模式的应用场景

(1)、客户端不需要知道其所需要的对象的类。因为在工厂方法模式中,客户端不需要知道具体产品类的类名,只需知道对应工厂即可

(2)、抽象工厂通过其子类来确定创建哪个对象,在抽象工厂类中只需要提供一个创建产品的接口,而尤其子类来确定具体创建的对象,利用面向对象的多态性和里氏替换原则,在程序运行时,子类对象覆盖父类对象,从而使系统更加容易扩展

工厂方法模式的具体实现

简单的工厂模式的实现

Factory的接口

//工厂类的接口
public interface LoggerFactory {Logger createLogger();}

Factory的具体实现

public class FileLoggerFactory implements LoggerFactory {@Override//具体产品public Logger createLogger() {Logger logger=new FileLogger();return  logger;}}
public class DatabaseLoggerFactory implements LoggerFactory {@Overridepublic Logger createLogger() {Logger logger=new DatabaseLogger();return  logger;}}

//辅助工具类,使用xml配置文件和反射技术增加程序的扩展性

public class XMLUtil {public static Object getBean(){try {//创建DOC对象DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();DocumentBuilder builder=builderFactory.newDocumentBuilder();Document document=builder.parse(new File(XMLUtil.class.getClassLoader().getResource("").getPath()+"config.xml"));//获取包含类名的文本节点NodeList nodeList=document.getElementsByTagName("className");Node node =nodeList.item(0).getFirstChild();  //获取第一位该节点值//通过类名生成实例对象并将其返回Class c=Class.forName(String.valueOf(node));Object o=c.newInstance();return o;}catch (Exception e){e.printStackTrace();return  null;}}
}

//所有产品的接口

//抽象产品
public interface Logger {void writeLog();
}

//产品的具体实现

public class FileLogger implements Logger {@Overridepublic void writeLog() {System.out.println("文件日志记录");}
}
public class DatabaseLogger implements Logger {@Overridepublic void writeLog() {System.out.println("数据库日志记录");}
}

//配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<config><className>com.company.factory.FileLoggerFactory</className>
</config>

//测试类

public class Main {public static void main(String[] args) {LoggerFactory loggerFactory;Logger logger;loggerFactory=(LoggerFactory)XMLUtil.getBean();  //返回OBJECT,需要强制转换logger=loggerFactory.createLogger();logger.writeLog();}
}

转载请注明出处,掌声送给社会人

设计模式的艺术 工厂方法模式相关推荐

  1. Java 设计模式之静态工厂方法模式

    设计模式系列 创建型设计模式 Java 设计模式之单例模式 Java 设计模式之静态工厂方法模式 Java 设计模式之工厂方法模式 Java 设计模式之抽象工厂模式 Java 设计模式之Builder ...

  2. 手撕设计模式之「工厂方法模式」(Java描述)

    前言 工厂方法模式是对简单工厂模式的改进,它通过对工厂类进行抽象形成一个抽象工厂接口,再让具体的工厂负责对应产品的创建,使得在增加产品的场景中也满足"开闭原则".希望通过本文的学习 ...

  3. 设计模式学习-工厂方法模式

    在上文(设计模式学习-简单工厂模式)的模拟场景中,我们用简单工厂模式实现了VISA和MASTERARD卡的刷卡处理,系统成功上线并运行良好,突然有一天老大跑来说,我们的系统需要升级,提供对一般银联卡的 ...

  4. 设计模式----创建型设计模式(单例模式、工厂方法模式、构建者模式)

    创建型设计模式 单例模式(Singleton Pattern) 单例模式介绍 代码演示 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(线程安全,同步方法) 懒汉式(线程安全, ...

  5. 【设计模式学习】工厂方法模式

    cpp学习设计模式:工厂方法模式 在学习工厂方法模式之前,先回忆前面学的简单工厂模式: 简单工厂模式就是将对象的创建和逻辑的判断都交给了一个工厂类去做,这样做的优点是客户端不需要知道具体产品类的类名和 ...

  6. 设计模式系列之 工厂方法模式

    定义 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 该定义是对生产者一方的描述,涉及四种角色,包括接口.接口实现类.被实例化的类.抽象产品(隐 ...

  7. 设计模式C++实现——工厂方法模式

    模式定义: 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 模式结构: Creator是一个类,它实现了全部操纵产品的方法,但不实现工厂方法 ...

  8. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  9. 设计模式之四:工厂方法模式(披萨店生产披萨模拟流程)

    工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类.(披萨店生产披萨模拟流程) 工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象的过程封 ...

最新文章

  1. linux中使用CST时间
  2. python构造方法与java区别_一张图秒懂Java和Python的区别,你知道吗?
  3. 介绍linux下Source Insight强大代码编辑器sublime_text_3
  4. echarts与TmodJS的冲突 -- 模块化加载器之间的冲突
  5. JAVA——改变观感
  6. AutoLISP绘制圆DCL对话框
  7. 贝叶斯网络+推理+近似推理+变分法
  8. C++11 Unicode 支持
  9. python method_用实例分析Python中method的参数传递过程
  10. 【转】ASPNET程序中常用的三十三种代码
  11. oracle 函数 如何编写
  12. FPGA模拟PS/2键盘
  13. 使用C++实现FC红白机模拟器 概述
  14. APISpace 全国行政区查询API
  15. Winmail反垃圾邮件指南:使用Winmail时,比较有效的过滤垃圾邮件的设置
  16. 《房地产证》与《房屋所有权证》或《房产证》有什么区别
  17. Android Studio运行app启动模拟器一直卡在“Wating for target device to come online”解决方法
  18. [生存志] 第79节 国语述诸国
  19. OpenCV中的基本图像操作
  20. 拒绝安利:安利的真相 丁黎

热门文章

  1. 扫个二维码微信就崩溃的原因找到了|附源码分析
  2. 写给ERP选型的伙伴们!
  3. python 逆转句子
  4. GoldenDict词典安装和使用
  5. 使用Codejock的换肤界面
  6. windows socket网络编程一:最简单的服务器和客户端搭建
  7. jQuery实现拖动
  8. java 如何调用 wsdl_java 调用wsdl的方式
  9. android activity之间跳转和数据传递参数,Activity跳转(有返回数据跳转)以及传递参数和回传参数...
  10. OJ 1004 不存在的泳池