工厂模式(Factory),当需要根据运行时的一些条件来决定创建具体对象时,就应该考虑使用工厂设计模式,将创建对象的任务交给工厂集中处理。

工厂模式有多种写法,总体分为简单工厂模式和抽象工厂模式

工厂模式示例:星工场

加入星工场可以生产各种明星:唱歌的,跳舞的,打篮球的...

明星抽象类

  1. public abstract class Star
  2. {
  3. public abstract void show();
  4. }

唱歌的

  1. public class SingStar extends Star
  2. {
  3. @Override
  4. public void show()
  5. {
  6. System.out.println("你看这碗又大又圆 你看这面又长又宽");
  7. }
  8. }

跳舞的

  1. public class DancingStar extends Star
  2. {
  3. @Override
  4. public void show()
  5. {
  6. System.out.println("唱 跳 Rap");
  7. }
  8. }

打篮球的

  1. public class BasketballStar extends Star
  2. {
  3. @Override
  4. public void show()
  5. {
  6. System.out.println("波兰第一中锋");
  7. }
  8. }

现在要创建一个明星,参数为明星的类型

不使用工厂

如果不使用工厂,就是在需要对象的地方,直接创建对象

  1. public Star newStar(String type)
  2. {
  3. Star star=null;
  4. if(type.equals("singer"))
  5. {
  6. star=new SingStar();
  7. }
  8. else if(type.equals("dancer"))
  9. {
  10. star=new DancingStar();
  11. }
  12. else if(type.equals("basketball"))
  13. {
  14. star=new BasketballStar();
  15. }
  16. return star;
  17. }

简单工厂模式

简单工厂其实就是把创建对象的代码抽取到一个单独的工厂类中,需要对象的地方,调用工厂类中的方法即可

  1. public class SimpleFactory
  2. {
  3. public Star newStar(String type)
  4. {
  5. Star star=null;
  6. if(type.equals("singer"))
  7. {
  8. star=new SingStar();
  9. }
  10. else if(type.equals("dancer"))
  11. {
  12. star=new DancingStar();
  13. }
  14. else if(type.equals("basketball"))
  15. {
  16. star=new BasketballStar();
  17. }
  18. return star;
  19. }
  20. }

还可以使用静态方法,称为静态工厂模式

  1. public static Star newStar(String type)
  2. {
  3. // ...
  4. }

还可以将表示对象类型的参数从字符串类型改为使用Class对象,进一步简化代码

  1. public static Star newStar(Class<? extends Star> clz)
  2. {
  3. try
  4. {
  5. return clz.getConstructor().newInstance();
  6. }
  7. catch(Exception e)
  8. {
  9. e.printStackTrace();
  10. }
  11. return null;
  12. }

使用的时候,传入对应类型的Class对象即可

  1. Star star = SimpleFactory.newStar(SingStar.class);
  2. star.show();

抽象工厂模式

抽象工厂模式,其实就是工厂的工厂。

首先需要定义工厂共同实现的接口,然后每个工厂分别实现它。

抽象工厂接口

  1. public interface Factory
  2. {
  3. Star newStar(Class<? extends Star> clz);
  4. }

具体工厂类略

Java实现工厂模式的更多相关文章

  1. !!转!!java 简单工厂模式

    举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...

  2. 一张图搞定Java设计模式——工厂模式! 就问你要不要学!

    小编今天分享的内容是Java设计模式之工厂模式. 收藏之前,务必点个赞,这对小编能否在头条继续给大家分享Java的知识很重要,谢谢!文末有投票,你想了解Java的哪一部分内容,请反馈给我. 获取学习资 ...

  3. Java抽象工厂模式

    Java抽象工厂模式 基本定义 抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象 ...

  4. Java的工厂模式(一)

    Java的工厂模式在框架中是用的到很多的,所谓的工厂模式,其实也就是用一个接口来创建对象,把实例化的工作推迟到子类去实现.这样在主函数中就可以直接创建一个工厂类,再通过这个工厂类实现操作. 假设有一个 ...

  5. Java简单工厂模式

    Java简单工厂模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简 ...

  6. Java 静态工厂模式的使用

    多相关文章请参考:http://www.enjoytoday.cn/categorys/java 静态工厂模式给人的第一印象就是:static+abstract.这两个词汇已经说明了一切,一个是周期长 ...

  7. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  8. java 深入浅出工厂模式

    一.引子 话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“ ...

  9. 10.Java设计模式 工厂模式,单例模式

    Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...

  10. 从基础知识到重写Spring的Bean工厂中学习java的工厂模式

    1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式:  单例模式是指控制其他对象获 ...

随机推荐

  1. 【例 3】 修改 bols 文件的 atime 和 mtime。 [root@localhost ~]# touch -d "2017-05-04 15:44" bols

    Linux touch命令:创建文件及修改文件时间戳 < Linux删除空目录(rmdir命令)Linux在文件之间建立软/硬链接(ln命令) > <Linux就该这么学>是一 ...

  2. 配置文件修改java安全级别和站点信息

    配置文件修改java安全级别和站点信息原创Green_1001 最后发布于2015-04-22 23:00:09 阅读数 516 收藏展开 通过配置文件修改java安全级别 配置文件名称为deploy ...

  3. inux操作系统测试工具

    inux操作系统测试工具 转载minions_222 最后发布于2017-08-02 11:42:13 阅读数 1481  收藏 展开 转自:http://blog.csdn.net/crisscha ...

  4. mysql的示例及练习

    示例及练习1-MOSHOU.hero.txtcreate database MOSHOU;use MOSHOU;create table hero(id int,name char(15),sex e ...

  5. salesforce零基础学习(一百零三)项目中的零碎知识点小总结(五)

    本篇参考:Salesforce Admin篇(四) Security 之Two-Factor Authentication & Single Sign On https://developer ...

  6. GO语言复合类型02---数组

    package main import "fmt" /* 固定长度.固定类型的数据容器 */ /*数组的声明*/ func main031() { //var array [5]i ...

  7. Echarts的柱状统计图出现x轴统计时间出现间隔显示的问题

    今天在使用Echarts的柱状统计图出现x轴统计时间出现间隔显示的问题: 数据都拿到了,放到Json数组都是完整的, 展现是时候 如下图:

  8. docker磁盘空间清理办法

    docker磁盘空间清理办法 前段时间遇到docker磁盘空间太少,无法写入数据的问题.起因是因为我在本地(Mac Pro)运行了多个mysql容器,并且导入了一部分线上数据,最后还没导入完毕就已经没 ...

  9. 摄像头ISP系统原理(下)

    摄像头ISP系统原理(下) l  WDR(Wide Dynamic Range)------宽动态 动态范围(Dynamic Range)是指摄像机支持的最大输出信号和最小输出信号的比值,或者说图像最 ...

  10. Torchvision模型微调

    Torchvision模型微调 本文将深入探讨如何对 torchvision 模型进行微调和特征提取,所有这些模型都已经预先在1000类的magenet数据集上训练完成.将深入介绍如何使用几个现代的C ...