设计模式之工厂方法模式

2023-10-30

  • 定义
    定义一个用于创建对象的接口,让子类决定实例化哪个类。
  • 使用场景
    在任何需要生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式。
public interface Car {
    public void make();
    public void buy();
}

public class BMW implements Car{

    @Override
    public void make() {
        System.out.println("生产宝马跑车");
    }

    @Override
    public void buy() {
        System.out.println("购买宝马跑车");
    } 
}

public class Ben implements Car{

    @Override
    public void make() {
        System.out.println("生产奔驰跑车");
    }

    @Override
    public void buy() {
        System.out.println("购买奔驰跑车");
    } 
}

public interface CarFactory {
    public Car product();
}

public class BWMFactory implements CarFactory{

    @Override
    public Car product() {
        return new BMW();
    }
}

public class BenFactory implements CarFactory{

    @Override
    public Car product() {
        return new Ben();
    }
}

public class JavaApplication10 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        CarFactory factory = new BenFactory();
        Car car = factory.product();
        car.make();
        car.buy();
        
        factory = new BWMFactory();
        factory.product().make();
        factory.product().buy();
    }
    
}

这种方式比较常见,需要哪一个产品就创建相应的工厂生产相应的产品,有时候也可以利用反射的方式更简洁地来生产具体产品对象,此时,需要在工厂方法的参数列表中传入一个Class类来决定是哪一个产品类。

public interface Car {
    public void make();
    public void buy();
}

public class BMW implements Car{

    @Override
    public void make() {
        System.out.println("生产宝马跑车");
    }

    @Override
    public void buy() {
        System.out.println("购买宝马跑车");
    } 
}

public class Ben implements Car{

    @Override
    public void make() {
        System.out.println("生产奔驰跑车");
    }

    @Override
    public void buy() {
        System.out.println("购买奔驰跑车");
    } 
}

public interface CarFactory {
    public <T extends Car> T product(Class<T> clz);
}

public class FactoryImpl implements CarFactory{

    @Override
    public <T extends Car> T product(Class<T> clz) {
        Car car = null;
        try {
            car = (Car) Class.forName(clz.getName()).newInstance();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(FactoryImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(FactoryImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(FactoryImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return (T) car;
    }
}

public class JavaApplication10 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        CarFactory factory = new FactoryImpl();
        Car car = factory.product(BMW.class);
        car.make();
        car.buy();

        factory.product(Ben.class).make();
        factory.product(Ben.class).buy();
    }
    
}

当我们的工厂生产的不只是一种产品的时候,就i要考虑将工厂也提取出一个抽象类——抽象工厂模式。例如,BenFactory在生产奔驰车的时候,还要考虑到轮胎的型号(假设有a和b两种型号的轮胎),那就要将BenFactory提升为抽象类,派生出两种不同的工厂类,一种工厂类专门生产a型号轮胎的奔驰车,一种工厂类专门生产b型号轮胎的奔驰车。

public interface ITire {
    void tire();
}
public interface IEngine {
    void engine();
}

public class NormalTire implements ITire{

    @Override
    public void tire() {
        System.out.println("普通轮胎");
    }
}

public class SUVTire implements ITire{

    @Override
    public void tire() {
        System.out.println("越野轮胎");
    }
}

public class AEngine implements IEngine{

    @Override
    public void engine() {
        System.out.println("A型发动机");
    }
}

public class BEngine implements IEngine{

    @Override
    public void engine() {
        System.out.println("B型发动机");
    }    
}

public interface CarFactory {
    public ITire createTire();//工厂类就是来生产对象的,因此工厂类的方法里面大都是new一个对象,然后返回。
    public IEngine createEngine(); 
}

public class AFactory implements CarFactory{

    @Override
    public ITire createTire() {
        return new NormalTire();
    }

    @Override
    public IEngine createEngine() {
        return new AEngine();
    }
}

public class BFactory implements CarFactory{

    @Override
    public ITire createTire() {
        return new SUVTire();
    }

    @Override
    public IEngine createEngine() {
        return new BEngine();
    }
    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之工厂方法模式 的相关文章

  • c语言实现面向对象编程(const * ,* const)

    c语言实现面向对象编程 面向对象思想 封装 继承 多态 代码实现 函数签名及返回值的约定 const 重载 参考了onlyshi的博客代码 orz传送门 参考了嵌入式实践一些代码 这里就不加了 面向对象思想 面向对象编程 OOP 并不是一种
  • 行为型模式-策略模式

    package per mjn pattern strategy 抽象策略类 public interface Strategy void show package per mjn pattern strategy 具体策略类 用来封装算法
  • 设计模式之(三)---工厂方法模式

    女娲补天的故事大家都听过吧 这个故事是说 女娲在补了天后 下到凡间一看 哇塞 风景太优美了 天空是湛 蓝的 水是清澈的 空气是清新的 太美丽了 然后就待时间长了就有点寂寞了 没有动物 这些看的到 都是静态的东西呀 怎么办 别忘了是神仙呀 没
  • 设计模式学习笔记(一)之单例模式

    单例模式 作用 保证一个类只有一个实例 并且提供访问这个实例的全局访问点 应用场景有 数据库连接池 spring中 Bean默认是单例 Servlet中 每一个Servlet是单例 配置文件的类 一般是单例 优点 单例只生成一个实例 减少系
  • 设计模式——原型模式

    原型模式顾名思义 就是指以某个实例为原型 copy出一个新的实例 该实例属性与原型相同或者是类似 很多时候 我们需要创建大量的相同或者相似的对象 如果一个个用new 构造函数的形式去创建的话比较繁琐 就像孙悟空要想变出成千上万个猴子猴孙总不
  • 设计模式--组合模式

    组合模式 又叫部分整体模式 属于结构型模式 基本原理 以树形的结构将相似的对象组合起来 主要流程 1 创建对象 2 在对象中设置用来存放下一级相似对象的数据结构 3 在对象中设置增删改查等功能 注意 这种模式和数据结构中的树形结构相似 in
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • [C++]备忘录模式

    备忘录模式 Memento Pattern 保存一个对象的某个状态 以便在适当的时候恢复对象 备忘录模式属于行为型模式 github源码路径 https github com dangwei 90 Design Mode 此文件包含 mai
  • 设计模式一之简单工厂模式

    生活示例 刻板印刷 gt 活字印刷举例 喝酒唱歌 人生真爽 gt 对酒当歌 人生几何 可维护 需要修改 则只需要改需要改的字即可 可复用 字体可在后来的印刷复用 可扩展 需要加字 只需要加入相应的刻字即可 灵活性好 字的排列可能竖排或横排
  • 设计模式 -- 工厂模式(Factory Pattern)

    简单工厂模式 Simple Factory Pattern 根据传入的参数决定实例化哪个对象 优点 不直接在客户端创建具体产品的实例 降低了耦合性 缺点 违反了开闭原则 对扩展开放 对修改关闭 不容易形成高内聚松耦合结构 每当我们增加一种产
  • 设计模式--Abstract server模式 VS Adapter 模式

    适配器类似于现实世界里面的插头 通过适配器 我们可以将分属于不同类的两种不同类型的数据整合起来 而不必去根据某一需要增加或者修改类里面的方法 Adapter mode和Proxymode的区别 Proxy的关注点是职能转移 通过引入Prox
  • 分享几个项目中用到的设计模式

    前言 之前项目中出于扩展性和有雅性的考虑 使用了多种设计模式进行项目框架的设计 主要的一些设计模式是单例模式 工厂模式 策略模式 责任链模式 代理模式这几种 现在依次讲讲这几个的主要是实现方式和在我们项目中的应用场景 核心设计模式分享 单例
  • linux内核中的设计模式

    创建型 Object Pool Object Pool模式可以提升性能 尤其是在对象的分配 初始化成本高 使用频率高 但使用时间短的情况下 对象池可以设置对象池的大小和回收时间缓存预分配的对象 NT和Linux都有简单的预分配缓存对象的机制
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • 设计模式之享元模式

    享元模式 就是共享技术 对于系统中存在大量相同的对象 把他们抽取成一个对象放在缓存中进行使用 这样可以大大节省系统资源 例如 围棋棋盘上有两种棋子 一个是黑子 一个是白子 如果在下棋的时候每下一个棋子就要new一个棋子对象 那么就会有大量的
  • [设计模式]模板方法模式(Template Method)

    1 意图 定义一个操作中的算法的骨架 而将一些步骤延迟到子类中 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2 动机 其实就是如意图所描述的 算法的骨架是一样的 就是有些特殊步骤不一样 就可以
  • 设计模式之访问者模式

    访问者模式 把被操作的对象作为元素 可变可拓展的操作作为访问者 可以说访问者中有很多操作 然后访问者访问元素 对该元素进行操作 不同的访问者有不同的操作 案例 定义访问者接口 public interface UniversalVisito
  • 二十四种设计模式之策略模式

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • 泛型与反射机制在JDBC和Servlet编程中的实践

    写在前面 泛型与反射是java中的两种强大机制 可以很好的提高代码的灵活性和复用性 本篇文章向大家展现在JDBC和Servlet编程场景下反射和泛型技术的实践 通过灵活使用这两种机制打造 高度可复用的JDBC和Servlet代码 1 JDB

随机推荐

  • Unity实现账号登录,注册功能

    制作了用户登录界面 关于弹窗使用了DOTween插件 实现渐隐渐显效果 关于账号使用了本地Json读取 默认账号 YSQS YSQS1 密码 admin admin1 注册功能其实应该重构的因为有二次读流的问题存在 账号注册加入了邀请码 其
  • eNSP配置数据中心网络

    需求 由于接入备份的需要 用户部署了冗余链路 冗余备份链路的存在导致出现环网 可能会引起广播风暴和MAC地址表项被破坏 用户希望在有冗余备份链路的同时消除网络中的环路 在一条上行链路断开时 流量能切换到另外一条上行链路转发 还能合理利用网络
  • B-树和B+树的区别

    首先 B 树的应用最多的就是在MySQL中的索引 是InnoDB存储引擎的默认索引 那么这个在面试中也是经常被问到的 那么就做一个总结吧 概念 要了解B 树那么就不得不提一下的是B 树 因为B 树和B 树是由很大的联系 B树 B tree
  • 介绍一款HCIA、HCIP、HCIE的刷题软件

    华为认证考试分为三个等级 分别为工程师HCIA 高级工程师HCIP 专家HCIE 等级越高 考试难度越大 本篇带大家详细了解华为数通题库刷题工具的详细操作步骤 操作须知 本款刷题工具为一款刷题小程序 无需安装即可在线使用 一 界面认知 从主
  • nginx配置文件

    1 文件格式 Nginx 的配置文件是 个普通的纯文本文件 使用了 Nginx 自定义的 一套 配置语法 更接近于 脚本语言 混合了 Shell Perl C 的部分特性 要点叙述如 1 配置指令 以分号结束 可以接受多个参数 用空白字符分
  • 算法序列----线性表

    线性表 由零个或多个数据元素组成的有限序列 1 属于一个序列 2 第一个元素没有前驱 最后一个没有后继 3 有限的 两种物理存储结构 1 顺序存储 2 链式存储 顺序存储 1 存储位置就是顺序的位置 2 数组的最大长度 3 当前长度 len
  • Mac Os下安装Myeclipse提示insufficient memory

    如图所示 搞了两天终于解决来 发现网上对此问题的解决办法也是说的不清不楚对 总的来说有三种方法 当然我只用了其中都一种 方法一 Mac OS中用虚拟内存来提高性能 可是我用的macbook 有8g内存 要用上虚拟内存还是比较少的 所以你可以
  • 【hive】分组求排名

    分组求排名 相信好多使用Mysql的用户一定对分组求排名的需求感到发怵 但是在hive或者oracle来说就能简单实现 采用窗口函数 rank over row number over dense rank over 函数就能轻松完成 窗口
  • SSL certificate problem: unable to get local issuer certificate 错误解决

    今天公司换服务器域名 用了一个本地的服务器 然后我切换远程仓库拉代码的时候 终端报了如下错误git SSL certificate problem unable to get local issuer certificate 这个问题是由于
  • 大数据毕设 opencv python 深度学习垃圾图像分类系统

    文章目录 0 前言 课题简介 一 识别效果 二 实现 1 数据集 2 实现原理和方法 3 网络结构 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉
  • python星座分析

    python数据分析 python数据分析是一个非常好用的 虽然python数据分析只是刚刚起步 有些功能还未开发完成 但是用来做数据分析是绰绰有余了 本人也是专门研究和学习python数据分析的 星座数据爬虫 作为一个学习数据分析的人 爬
  • 在Apifox中,使用后置脚本显示响应结果reponse中的base64图片

    背景 在使用Apifox去请求有图片的接口时 我想要请求成功的同时 可以显示出来图片 这个时候就开始百度找官方文档 最终发现可以使用后置脚本显示reponse中的图片 方案 如下图所示 接口请求成功后 返回的json结构为 images p
  • 简单了解Linux图形界面

    之前曾经发生过启动虚拟机进入不了图形界面的情况 关于RedHat开启失败的解决方法 m0 48788975的博客 CSDN博客 在我看书的过程中总算搞清楚这是怎么一回事了 下面就和大家唠两句Linux视图 一 Linux操作界面主要分为传统
  • 机器学习_数据处理及模型评估相关资料

    基于sklearn 的auc 计算方法 训练模型填充空值 fill null 的几种方法 在Pandas中像写SQL一样做数据分析
  • Java通过freemarker实现导出PDF

    制作模板 引入依赖 引入所需字体文件 工具类的编写 业务实现 一 模板制作 1 编写html代码 需要替换的值与内容预留出来 用 name 代替 需循环处 表格前加上 lt list listKey as t gt t name 2 将写好
  • 浅谈React浏览器渲染流程

    当浏览器发送一个请求 会得到对应的响应 浏览器会通过HTML解析器去解析HTML会构建DOM树 会通过CSS解析器去解析CSS生成CSS规则树 如果页面中拥有一些JS逻辑 那么往往会通过JS将CSS HTML进行修改的操作 往往造成重排重绘
  • SPADE: Semantic Image Synthesis with Spatially-Adaptive Normalization

    目录 介绍 相关工作 1 Unconditional normalization layers 2 Conditional normalization layers 这一部分挺重要的 方法 3 1 Spatially adaptive de
  • 编译实验(三)目标代码生成

    通过词法分析 语法分析 语义分析 最后产生了四元式 而代码生成则是通过四元式来完成 我们先从简单开始做起 编译实验项目下载链接 http download csdn net download supersmart dong 10224159
  • 源码安装LAMP环境+yii2框架

    当有些新增的软件版本出现 而你想要进行尝试使用 但是在本地用yum安装却不能满足你的需求时 那么朋友 你需要和我一样用源码安装的形式来达成你的目的 因为开发的同事想要一个Apache 2 4 25 Mysql 5 7 17 php7 1 5
  • 设计模式之工厂方法模式

    定义 定义一个用于创建对象的接口 让子类决定实例化哪个类 使用场景 在任何需要生成复杂对象的地方 都可以使用工厂方法模式 复杂对象适合使用工厂模式 public interface Car public void make public v