博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂方法模式
阅读量:4180 次
发布时间:2019-05-26

本文共 1918 字,大约阅读时间需要 6 分钟。

定义

工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

这样核心工厂类不再负责产品的创建,变成一个抽象工厂角色,仅负责具体工厂子类必须要实现的接口。这样进一步抽象的好处是系统在不修改具体工厂角色的情况下引进新的产品。

类图及角色

在这里插入图片描述

抽象工厂(Creator):工厂方法模式的核心,与应用程序无关。任何模式下创建的对象的工厂类都必须实现这个接口。
具体工厂(Concrete Creator):实现工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且接收客户端调用创建产品对象。
抽象产品(Product):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品(Concrete Product):实现了抽象产品定义的接口。具体产品由具体工厂创建,它们之间一一对应。

案例代码
//日志系统,充当抽象产品角色public interface Logger {
public void writeLog();}//文件日志记录器,充当具体产品角色public class FileLogger implements Logger {
@Override public void writeLog() {
System.out.println("文件日志记录"); } }//数据库日志记录器,充当具体产品角色public class DatabaseLogger implements Logger {
@Override public void writeLog() {
System.out.println("数据库日志记录"); }}//日志记录器工厂接口,充当抽象工厂角色public interface LoggerFactory {
public Logger createLogger();}//文件日志工厂public class FileLoggerFactory implements LoggerFactory {
@Override public Logger createLogger() {
Logger logger = new FileLogger(); return logger; }}//数据库日志工厂public class DatabaseLoggerFactory implements LoggerFactory {
@Override public Logger createLogger() {
Logger logger = new DatabaseLogger(); return logger; }}//客户端public class Client {
public static void main(String[] args) {
LoggerFactory factory1 = new FileLoggerFactory(); Logger logger1 = factory1.createLogger(); logger1.writeLog(); LoggerFactory factory2 = new DatabaseLoggerFactory(); Logger logger2 = factory2.createLogger(); logger2.writeLog(); }}
简单工厂模式和工厂方法模式的对比

简单工厂模式又叫静态工厂模式,它用来实例化目标类的静态类。简单工厂是不完全满足OCP。最大的区别:简单工厂模式只有一个工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

优点
  1. 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户端隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需要产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
  2. 基于工厂角色和产品角色的多态性设计是工厂方法的关键,他能够让工厂模式自主的创建产品对象,而如何创建这个对象的细节完全封装在工厂类。
  3. 使用工厂方法模式最大的优点就是新加类的时候不用动源代码,只要写新的产品新的工厂来继承对应的类就行了。
缺点
  1. 结构复杂度。
  2. 代码复杂度。
  3. 客户端编程复杂度。
  4. 管理复杂度。
    如:当多个产品需要修改时,简单工厂模式仍然仅仅修改唯一的工厂类,而工厂模式需要修改很多的类。

上一篇:

下一篇:

转载地址:http://elrai.baihongyu.com/

你可能感兴趣的文章
JPA主键生成策略
查看>>
byte数组和InputStream的相互转换
查看>>
InputStream,InputStreamReader和Reader之间的区别与关系
查看>>
Java中System.arraycopy方法的使用
查看>>
tk.mybatis的使用记录
查看>>
遍历获取目录下的所有文件
查看>>
从指定服务器路径下载文件
查看>>
EasyExcel读取和写入java model数据
查看>>
《C编译原理》共享库的动态加载和静态加载
查看>>
《Android系统学习》第二章:如何制作OTA U盘升级包
查看>>
《Android系统学习》第五章:编译Android的JDK环境
查看>>
《C++特性》之引用类型
查看>>
fflush(stdin)在gcc编译器中不起作用?
查看>>
《Android系统学习》第九章:Android模拟器编译
查看>>
《Android系统学习》第十章:Android消息处理、消息循环和消息队列
查看>>
《Android系统学习》第十一章:Android应用程序Activity组件分析
查看>>
Android4.2 Input子系统
查看>>
《C++面向对象》结构体继承
查看>>
《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
查看>>
指向指针的指针
查看>>