首页 > 其他分享 >02 创建型模式-工厂方法模式

02 创建型模式-工厂方法模式

时间:2022-11-19 22:33:22浏览次数:51  
标签:02 创建 模式 工厂 具体 产品 ImgReader public

一、工厂方法模式

image

抽象产品:描述具体产品的公共接口。
具体产品:象产品的子类,工厂类要创建的目标类,描述生产的具体产品。
抽象工厂:描述具体工厂的公共接口。
具体工厂:抽象工厂的子类;被外界调用,实现 FactoryMethod 工厂方法创建产品的实例。
创建过程:
①:创建抽象工厂类,定义具体工厂的公共接口;
②:创建抽象产品类 ,定义具体产品的公共接口;
③:创建具体产品类(继承抽象产品类)与定义生产的具体产品;
④:创建具体工厂类(继承抽象工厂类)与定义创建对应具体产品实例的方法;
⑤:外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例。

  • 工厂方法模式的优点:
    • 更符合开-闭原则,新增一种产品时,只需要增加相应的具体产品类
      和相应的工厂子类即可;
    • 符合单一职责原则,每个具体工厂类只负责创建对应的产品,不使用静态工厂方法,可以形成基于继承的等级结构;
  • 工厂方法模式的缺点:
    • 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂
      类,增加系统复杂度。

二、工厂方法模式例题

  现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器 ImgReader,如 gif 图片读取器 GifReader 用于读取 gif 格式的图片,jpg 图片读取器 JPGReader 用于读取 jpg 格式的图片。图片读取器对象通过图片读取器工厂ImgReaderFactory 来创建。ImgReaderFactory 是一个抽象类,用于定义创建图片读取器的工厂方法,其 GifReaderFactory 和 JPGReaderFactory 用于创建具体的图片读取器对象。使用工厂方法模式,实现该程序的设计。

image

抽象工厂:ImgReaderFactory 接口,有一个用来生产 ImgReader 产品的方法;
具体工厂:GifReaderFactory 和 JpgReaderFactory 实现了 ImgReaderFactory 接口,并有一个用来生产具体产品的方法;
抽象产品:ImgReader 接口,有一个 read 的方法;
具体产品:GidReader,JpgReader 实现了 ImgReader 接口和 read 方法。
Client:用来测试使用工厂来生产具体产品。

代码实现:

// 抽象工厂接口
public interface ImageReaderFactory {
    public ImgReader createReader();
}

// 具体工厂 GifReaderFactory
public class GifReaderFactory implements ImageReaderFactory {
    @Override
    public ImgReader createReader() {
        return new GIfReader();
    }
}

// 具体工厂 JpgReaderFactory
public class JpgReaderFactory implements ImageReaderFactory {
    @Override
    public ImgReader createReader() {
        return new JpgReader();
    }
}

// 抽象产品接口
public interface ImgReader {
    void read();
}

// 具体产品 GIfReader
public class GIfReader implements ImgReader {
    @Override
    public void read() {
        System.out.println("gif");
    }
}

// 具体产品 JpgReader
public class JpgReader implements ImgReader {
    @Override
    public void read() {
        System.out.println("jpg");
    }
}

// 测试
public class Client {
    public static void main(String[] args) {
        ImageReaderFactory factory1 = new JpgReaderFactory();
        ImgReader reader1 = factory1.createReader();
        reader1.read(); // 输出 jpg
        ImageReaderFactory factory2 = new GifReaderFactory();
        ImgReader reader2 = factory2.createReader();
        reader2.read(); // 输出 gif
    }
}

标签:02,创建,模式,工厂,具体,产品,ImgReader,public
From: https://www.cnblogs.com/hbjiaxin/p/16907365.html

相关文章

  • #yyds干货盘点#【愚公系列】2022年11月 微信小程序-多人音视频对话
    前言微信小程序开发多人音视频对话首先得去小程序管理后台,「开发」-「接口设置」中自助开通该组件权限。相关属性:一级类目/主体类型二级类目小程序内容场景教......
  • CSP-J 2022游记
    本文章同步发布于洛谷博客初赛初赛-90天从今年暑假开始学习。教练说我很有天赋,所以暑假直接跟着入门班上。整个暑假就是在持续学基础知识,最后几周开始刷前几年的复......
  • 第一节课-创建项目
    一、打开idea点击创建项目 二、项目名称的设置 三、选择要引入的包  四、项目就创建完成了 五、项目创建后可以给项目中不需要的几项删除掉 六、一个简......
  • 结构型模式-装饰模式
    一、装饰模式Component类:抽象构件,给出一个抽象类(或接口),以规范准备接收附加责任或附加功能的对象ConcreteComponent类:具体构件,定义一个将要接收附加责任或附加功能的对......
  • 024.PageHelper分页插件
    1.分页查询要面临的问题  2.使用流程  2.1pom.xml<dependency><groupId>com.github.pagehelper</groupId><artifactId>pag......
  • 华东交通大学2022双基ACM竞赛
    比赛链接:https://ac.nowcoder.com/acm/contest/44482签到:AEI碎碎念:好家伙,题目里全是心怡。A:心怡的魔法城堡原题链接:心怡的魔法城堡题意:闯入者可以选择到达上出口或......
  • 秦皇岛2020CCPC补题
    秦皇岛2020CCPCA,E,F,G,I,KA.AGreetingfromQinhuangdao知识点:简单题复杂度:\(O(logn)\)#include<bits/stdc++.h>usingnamespacestd;#definerep(i,l,r)for(in......
  • 2022-11-19 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • GKCTF2020-domo
    例行检查全绿,64位保护全开。动态分析增删查改四个功能增删查改改这个功能没太勘定似乎是需要我们输入一个地址去修改,这好像就造成了任意地址写,不太确定,稍后通......
  • 2022 zafu校赛题解
    A煎饼哥哥好鲨题读入时,分别统计四种不同提交结果,最后按题目要求输出即可。代码链接B富哥磊神暴力枚举三种纸币的数量,统计合法付款方式的数量即可。注意优化暴力枚举......