提供了比工厂模式更高一级的接口级,用于返回若个工厂之一。这个模式是属于创建模式之一。有几点值得注意:

  1. 对象的创建充分重用重要的代码。
  2. 对象的创建需要访问某个信息或者资源时,这对象不应该包含在组合类中。
  3. 一般对象生命周期管理必须集中化,确保应用程序中行为的一致性。
分析一个例子,如下:
定义一个枚举类型的CarType类,列出车的类型。
public enum CarType {SMALL, SEDAN, LUXURY
}

抽象Car类,所有的子类扩展Car这个类实现自己的特有功能。

public abstract class Car {private CarType model = null;public Car(CarType model) {this.model = model;arrangeParts();}private void arrangeParts() {// Do one time processing here}// Do subclass level processing in this methodprotected abstract void construct();public CarType getModel() {return model;}public void setModel(CarType model) {this.model = model;}
}

分别定义SmallCar、Sedan和Luxury类。

public class SmallCar extends Car{SmallCar() {super(CarType.SMALL);construct();}@Overrideprotected void construct() {System.out.println("Building small car");// add accessories}
}
public class SedanCar extends Car {SedanCar() {super(CarType.SEDAN);construct();}@Overrideprotected void construct() {System.out.println("Building sedan car");// add accessories}
}
public class LuxuryCar extends Car {LuxuryCar() {super(CarType.LUXURY);construct();}@Overrideprotected void construct() {System.out.println("Building luxury car");// add accessories}
}

定义FactoryCar工厂类,现实具体的调用。

public class CarFactory {public static Car buildCar(CarType model) {Car car = null;switch (model) {case SMALL:car = new SmallCar();break;case SEDAN:car = new SedanCar();break;case LUXURY:car = new LuxuryCar();break;default:// throw some exceptionbreak;}return car;}
}

测试工厂类,单元测试如下:

public class CarFactoryTest {@SuppressWarnings("deprecation")@Testpublic void testCarFactory() {Assert.assertEquals(true, CarFactory.buildCar(CarType.SMALL) instanceof Car) ;Assert.assertEquals(true, CarFactory.buildCar(CarType.SEDAN) instanceof Car) ;Assert.assertEquals(true, CarFactory.buildCar(CarType.LUXURY) instanceof Car) ;}
}

输出结果如下:

Building small car
Building sedan car
Building luxury car
工厂模式的使用场合:
1.创建相关的家族或是依赖对象,比如Kit.
2. 提供一个产品类库,显露接口,但是不包括实现。
3. 修要从超类哪里隔离具体的实现类.
4. 系统需要独立出系统的产品如何创建、组合和呈现。
如果你想做一深入的研究,可以查阅Java API代码.
  • java.sql.DriverManager#getConnection()
  • java.net.URL#openConnection()
  • java.lang.Class#newInstance()
  • java.lang.Class#forName()

工厂设计模式(Factory Pattern)相关推荐

  1. 类对象工厂设计模式(Factory Pattern)

    本文朋友在深圳逛街的时候突然想到的...这段时间就有想写几篇关于类对象的笔记,所以回家到之后就奋笔疾书的写出来发布了 提供了比工厂模式更高一级的接口级,用于返回若个工厂之一.这个模式是属于创立模式之一 ...

  2. 设计模式(四)——工厂模式(Factory Pattern)

    工厂模式(Factory Pattern) 意义 工厂模式 实现了创建者和调用者的分离.将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦.从而提高项目的扩展和维护性 ...

  3. 设计模式 - 学习笔记 - 工厂模式Factory Pattern

    设计模式 - 学习笔记 - 工厂模式Factory Pattern 1. 简单工厂 1.1 应用场景 1.2 UML 1.3 优劣分析 好处 缺点 1.4 代码示例 抽象产品 AbstractProd ...

  4. 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。

    设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...

  5. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  6. Spring模式系列(二) 工厂模式(Factory Pattern) - 理解Spring的第一课

    factory pattern在spring的用法 Beanfactory spring框架最依赖的模式,没有之一 这也许是最多程序员使用过的模式之一,我也在我的项目中用过很多次.工厂模式贯穿于整个S ...

  7. 【设计模式】工厂模式 Factory Pattern

    1)简单工厂(不是模式) 简单工厂只是一种变成习惯,并非23种设计模式之一. 简单工厂提供将实例话那种类型留给运行时判断,而非编译时指定.简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一个类的 ...

  8. 设计模式 抽象工厂(Abstract Factory Pattern)

    抽象工厂模式,比工厂模式具有更高层次的抽象.当要返回一系列相关类中的某一个,而每个类都能根据需要返回不同的对象时,可以使用这种模式.换句话说,抽象工厂是一个工厂对象,他能返回一系列相关类中的一个类.可 ...

  9. JAVA设计模式Design Pattern→单例模式Singleton Pattern、工厂模式Factory Pattern、代理模式Proxy Pattern

    私有化构造函数的类可以提供相应的 "接口"(一般就是静态方法)来返回自己的唯一实例供外部调用,像这样的确保只生成一个实例的模式被称作单例模式. 工厂模式,一个模型,用来大规模的生产 ...

最新文章

  1. 亿级浏览型网站静态化架构演变
  2. java分布式对象——远程方法中的参数和返回值+远程对象激活
  3. Rafy 框架 - 使用 SqlTree 查询
  4. 【安全】基于角色的访问控制
  5. 微服务升级_SpringCloud Alibaba工作笔记0005---spring gateway非阻塞异步模型
  6. 天气查询接口演示示例
  7. 模拟恶劣网络环境常用的几种解决方案
  8. python将list转为数组_python如何将list中的字符转为数字
  9. 五、Linux常用命令——帮助命令
  10. java 新建项目_java怎么新建项目?java新建项目实操案例
  11. 迅雷2019校园招聘 内推码
  12. CV之ModelScope:基于ModelScope框架的人脸人像数据集利用DCT-Net算法实现人像卡通化图文教程之详细攻略
  13. 带你快速通过字节跳动面试,看看这篇文章吧!
  14. 2018拼多多校招【最大乘积】Python解法
  15. php活体检测,双目活体检测摄像头,人脸识别SDK,红外活体算法
  16. 大二学期总结(我的机器人开发之路)
  17. Linux Terminal终端常用快捷键
  18. 深入理解虚拟/物理地址转换,页表--基于ARMV8
  19. APP自动化--元素操作之九宫格解锁密码图案
  20. 美团点评2020校招系统开发方向笔试题(编程题题解)

热门文章

  1. OpenCV-图像像素遍历操作的三种方法对比(程序提速)
  2. php 7怎么安装mysql_php7如何安装mysql扩展
  3. 组件中使用_尚德高效组件全线投入壳牌首个光伏项目中使用
  4. 织梦++高级搜索php,织梦高级搜索页面advancedsearch.php调用自定义字段
  5. 采用Locust对grpc协议进行压测
  6. 21天Jenkins打卡Day16-清理工作空间
  7. 暴涨2000+? 2021年软件测试平均薪资出来了,我坐不住了
  8. 从测试用例角度来看传统测试人员更专业?
  9. master节点重置后添加node报错_土豆SUPER通过Node-Red接入HASS和Homekit
  10. java email怎么设置端口号_java mail 设置参数