设计模式-工厂方法模式

 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式的图片、JPG图片读取器(JpgReader)用于读取JPG格式的图片。图片读取器对象通过图片读取器工厂ImageReaderFactory来创建,ImageReaderFactory是一个抽象类,用于定义创建图片读取器的工厂方法,其子类GifReaderFactoryJpgReaderFactory用于创建具体的图片读取器对象。使用工厂方法模式设计该程序,绘制类图并编程模拟实现。需充分考虑系统的灵活性和可扩展性。

类图:

实现代码:

ImageReadeFactary类:

public abstract class ImageReaderFactory {

     public abstract ImageReader createImageReadeer();

}

GifReaderFactory类:

public class GifReaderFactory extends ImageReaderFactory {

    public ImageReader createImageReadeer() {

        GifReader gifReader = new GifReader();

        return gifReader;

    }

}

JpgReaderFactory 类:

public class JpgReaderFactory extends ImageReaderFactory {

    public ImageReader createImageReadeer() {

      JpgReader jpgReader = new JpgReader();

        return jpgReader;

    }

}

ImageReader 类:

public abstract class ImageReader {

    public  void  readImage(){}

}

GifReader 类:

public class GifReader extends ImageReader{

    public  void  readImage(){

        System.out.println("通过GifReader读取图片");

    }

}

JpgReader 类:

public class JpgReader extends ImageReader{

    public  void  readImage(){

        System.out.println("通过JpgReader读取图片");

    }

}

XMLUtil 类:

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import java.io.File;

public class XMLUtil {

    //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象

    public static Object getBean() throws Exception {

        //创建DOM文档对象

        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

        Document document;

        document = documentBuilder.parse(new File("config.xml"));

        //获取包含类名的文本结点

        NodeList nodeList = document.getElementsByTagName("imageType");

        Node imageTypeNode = nodeList.item(0).getFirstChild();

        String imageType = imageTypeNode.getNodeValue().trim();

        //通过类名生成实例对象并将其返回

        Class clazz  = Class.forName(imageType+"ReaderFactory");

        Object object = clazz.newInstance();

        return object;

    }

}

Main 类(客户端):

public class Main {

    public static void main(String[] args) {

        ImageReaderFactory imageReaderFactory = null;

        ImageReader imageReader;

        try {

            imageReaderFactory = (ImageReaderFactory)XMLUtil.getBean();

        } catch (Exception e) {

            e.printStackTrace();

        }

        imageReader = imageReaderFactory.createImageReadeer();

        imageReader.readImage();

    }

}


猜你喜欢

转载自blog.csdn.net/qq_35522904/article/details/80055787