• 设计模式之工厂方法模式应用例题


    设计模式之工厂方法模式应用例题

    题目描述

    现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReader),如GIF图片读取器(GifReader)用于读取GIF格式图片、JPEG图片读取器(JPEG)用于读取JPEG格式的图片。图片读取器对象通过图片读取器工厂ImageReaderFactory来创建。请使用工厂方法模式实现该程序的设计,绘制类结构图、类图说明及编写相应代码

    类结构图及相关说明

    在这里插入图片描述
    ImageReader接口:抽象产品,它ImageReader接口是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。ImageReader接口中声明了抽象方法read()。
    GifReader类:具体产品类,它GifReader类实现了抽象产品接口ImageReader接口,实现Gif的read方法。具体产品GifReader类由专门的具体工厂GifReaderFactory类创建,具体工厂GifReaderFactory类和具体产品GifReader类之间一一对应。
    JPEG类:具体产品类,它JPEG类实现了抽象产品接口ImageReader接口,实现JPEG的read方法。具体产品JPEG类由专门的具体工厂JPEGFactory类创建,具体工厂JPEGFactory类和具体产品JPEG类之间一一对应。
    ImageReaderFactory接口:抽象工厂类,在抽象工厂类ImageReaderFactory接口中声明了工厂方法getImgerReader(),用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现接口。
    GifReaderFactory类:具体工厂类,它GifReaderFactory类是抽象工厂类ImageReaderFactory接口的子类,实现了在抽象工厂ImageReaderFactory接口中声明的工厂方法getImgerReader,并可由客户端Client类调用,返回一个具体产品类的实例imageReader。
    JPEGFactory类:具体工厂类,它JPEGFactory类是抽象工厂类ImageReaderFactory接口的子类,实现了在抽象工厂ImageReaderFactory接口中声明的工厂方法getImgerReader(),并可由客户端Client类调用,返回一个具体产品类的实例imageReader。

    程序代码

    ImageReader接口

    //抽象产品,产品接口
    public interface ImageReader {
        //定义抽象类方法read
        public void read();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    GifReader类

    //具体产品,实现抽象产品接口
    public class GifReader implements ImageReader{
        //重写read方法,定义Gif图片的read方法
        @Override
        public void read() {
            System.out.println("读取Gif格式图片!!!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    JPEG类

    //具体产品,实现抽象产品接口
    public class JPEG implements ImageReader{
        //重写read方法,定义JPEG图片的read方法
        @Override
        public void read() {
            System.out.println("读取JPEG格式的图片!!!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ImageReaderFactory接口

    //抽象工厂
    public interface ImageReaderFactory {
        //声明工厂方法,用于返回一个产品
        public ImageReader getImgerReader();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    JPEGFactory类

    //具体工厂,抽象工厂类的子类,实现在抽象工厂中声明的方法
    public class JPEGFactory implements ImageReaderFactory{
        //实例化JPEG工厂返回具体产品
        @Override
        public ImageReader getImgerReader() {
            ImageReader imageReader = new JPEG();
            return imageReader; //返回一个具体产品
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    GifReaderFactory类

    //具体工厂,抽象工厂类的子类,实现在抽象工厂中声明的方法
    public class GifReaderFactory implements ImageReaderFactory{
        //实例化Gif工厂并且返回具体产品
        @Override
        public ImageReader getImgerReader() {
            ImageReader imageReader = new GifReader();
            return imageReader;//返回一个具体产品
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Client类

    //客户端测试类
    public class Client {
        public static void main(String[] args) {
            ImageReaderFactory imageReaderFactory1 = new GifReaderFactory();
            ImageReaderFactory imageReaderFactory2 = new JPEGFactory();
    
            imageReaderFactory1.getImgerReader().read();
            imageReaderFactory2.getImgerReader().read();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果

    在这里插入图片描述

  • 相关阅读:
    在vscode使用MATLAB
    Java基础:Java基本概念
    BLE学习(3):ATT和GATT详解
    Linux :realpath 命令
    留学生作业Java程序帮做Javaweb帮做
    TensorFlow 的基本概念和使用场景
    Linux常用操作 & Vim一般使用 & SSH介绍 & SSH密钥登录
    9.Eureka服务发现+Ribbon+RestTemplate服务调用
    Linux内核版本号
    docker基础(一)
  • 原文地址:https://blog.csdn.net/m0_46669450/article/details/125547209