深入Java设计模式之工厂模式

简介: 深入Java设计模式之工厂模式

工厂模式的适用场景

工厂模式适用的一些场景(不仅限于以下场景):

1. 对象的创建过程/实例化准备工作很复杂,需要初始化很多参数、查询数据库等。

2.类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变。

工厂模式的设计原则

有定义一个创建对象的接口,让子类做具体的实现,而对象的创建统一交由工厂去生产,有良好的封装性,既做到了解耦,也保证了最少知识原则。

任何的设计模式都是用来解决某一些特定场景问题的一种思想,如果在开发过程中遇到某一些问题,可以回顾自己脑海中的所有知识,是不是可以使用设计模式去解决,当然自己也可以不用设计模式,用其他的方式也是可以的,只要能解决就可以。

案例实战

编写读文件功能。读取文件,包括编码(GBK,UTF-8,UNIONCODE)的文本文件,要求获取文本内容。读取图像文件(BMP,GIF,JPG),要求获取图像宽度、高度、长度、以及每一点的RGB基色信息。

首先我们可以写出一个基本的工厂类模式,如下所示,生成对应的读取总接口,以及对应的文本和图像抽象类,及对应的子列,对应子类的工厂方法,实现要求

一、根据语意画出层次功能图 和UML图

 

层次功能图

 

读取文件的UML图

 

二、定义读取文本、图像的接泛型口:

package com.lzhsite.technology.designPattern.factory;
/**
 * 类描述:读文本、图像文件接口
 * 
 */
public interface IRead<T> {
  /**
   * 
   * 方法说明:根据传入的文件名读取文件
   * 
   * Author: Jing Create Date: Dec 18, 2014 4:15:27 PM
   * 
   * @param in
   * @return
   * @return T
   */
  T read(String... in);
}

三、定义读取图像和文件的具体实现类

package com.lzhsite.technology.designPattern.factory;
import java.io.File;
import java.io.FileInputStream;
/**
 *  类描述:文本读取
 *           
 */
public class TextRead implements IRead<String> {
  public String read(String... in) {
    String result = null;
    try{
      File file = new File(in[0]);
      long len = file.length();//文件长度
      FileInputStream fis = new FileInputStream(in[0]);//in[0] 存储文件名称
      byte buf[] = new byte[(int)len];
      fis.read(buf);
      result = new String(buf, in[1]);//in[1]存储编码方式
      fis.close();
    }catch(Exception e){
      System.out.println(e.getMessage());
    }
    return result;
  }
}
package com.lzhsite.technology.designPattern.factory;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
 *  类描述:图像文件读取
 *           
 */
public class ImageRead implements IRead<ImageInfo>{
  public ImageInfo read(String... in) {
    BufferedImage bi = null;
    File f = new File(in[0]);//in[0]存储文件名
    try {
      bi = ImageIO.read(f);
    } catch (IOException e) {
      e.printStackTrace();
    }
    int width = bi.getWidth();
    int height = bi.getHeight();
    int rgb[] = new int[width * height];
    bi.getRGB(0, 0, width, height, rgb, width, height);
    ImageInfo info = new ImageInfo();
    info.setWidth(width);
    info.setHeight(height);
    info.setRGB(rgb);
    return info;
  }
}

四、定义抽象工厂

package com.lzhsite.technology.designPattern.factory;
/**
 *  类描述:抽象工厂
 */
public abstract class AbstractFactory {
  /**
   * 
   * 方法说明:获取对应的读取对象
   *
   * @return
   * @return IRead
   */
  @SuppressWarnings("unchecked")
  public abstract IRead create();
  /**
   * 
   * 方法说明:使用反射,根据掺入的类名生成对应的对象
   *
   * @param className
   * @return
   * @return AbstractFactory
   */
  static AbstractFactory create(Class clazz){
    AbstractFactory factory = null;
    try{
      factory = (AbstractFactory) clazz.newInstance();
    }catch(Exception e){
      e.printStackTrace();
    }
    return factory;
  }
}

五、定义具体工厂

package com.lzhsite.technology.designPattern.factory;
/**
 * 类描述:图像读取
 * 
 */
public class TextFactory extends AbstractFactory {
  @SuppressWarnings("unchecked")
  @Override
  public IRead create() {
    return new TextRead();
  }
}
package com.lzhsite.technology.designPattern.factory;
/**
 * 类描述:图像读取
 * 
 */
public class ImageFactory extends AbstractFactory {
  @SuppressWarnings("unchecked")
  @Override
  public IRead create() {
    return new ImageRead();
  }
}

六、测试代码

package com.lzhsite.technology.designPattern.factory;
public class ReadTest{
  public static void main(String[] args) {
    TextFactory textFactory = (TextFactory) AbstractFactory.create(TextFactory.class);
    IRead iRead = textFactory.create();
    iRead.read("test.txt","utf-8");
  }
}

 


目录
相关文章
|
3月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
3月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
56 4
|
4月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
92 0
[Java]23种设计模式
|
3月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
114 0
|
4月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
5月前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
5月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
5月前
|
设计模式 存储 缓存
Java设计模式 - 解释器模式(24)
Java设计模式 - 解释器模式(24)
|
5月前
|
设计模式 安全 Java
Java设计模式-迭代器模式(21)
Java设计模式-迭代器模式(21)
|
5月前
|
设计模式 缓存 监控
Java设计模式-责任链模式(17)
Java设计模式-责任链模式(17)