设计模式之工厂方法模式

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(使用前将#替换为@)

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

  • 没有微信和QQ,用记事本也能在线聊天

    很多公司因为安全的原因 并不允许员工装QQ或者微信等聊天软件 只能装公司内部的聊天软件 但是你的朋友不是同事的话也不可能会装你公司的内部软件 如果这个时候想要跟朋友聊一聊 那怎么办呢 很多人会说用手机啊 不过用手机太多也会带上工作时候聊天的

随机推荐

  • 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