模式定义

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式定义了一个创建对象的类,由这个类来封装实例化对象的行为。

设计原则

遵循的原则:

依赖倒置原则

迪米特法则

里氏替换原则

接口隔离原则

未遵循的原则

开闭原则

单一职责原则

UML类图

简单工厂模式实例

问题描述

Pizza 类有很多子类,要求根据不同的情况用不同的子类实例化一个 Pizza 对象。

首先我们定义披萨接口

package com.wpx.simplefactory;

/**

* 定义披萨接口

*/

public interface Pizza {

public void make();

}

接着,定义两个具体的披萨类,乳酪比萨和希腊披萨

package com.wpx.simplefactory;

/**

* 具体的披萨-乳酪比萨

*/

public class CheesePizza implements Pizza {

@Override

public void make() {

System.out.println("乳酪比萨");

}

}

package com.wpx.simplefactory;

/**

* 具体的披萨-希腊披萨

*/

public class GreekPizza implements Pizza {

@Override

public void make() {

System.out.println("希腊披萨");

}

}

紧接着,我们定义一个披萨工厂来生产披萨

package com.wpx.simplefactory;

/**

* 披萨工厂类

*/

public class SimplePizzaFactory {

public static Pizza createPizza(String type) {

if (type.equals("乳酪比萨")) {

return new CheesePizza();

} else if (type.equals("希腊披萨")) {

return new GreekPizza();

} else {

throw new UnsupportedOperationException();

}

}

}

现在一个基于简单工厂模式的披萨工厂就建造完成了,我们对此进行测试,让披萨工厂来一份乳酪披萨尝尝。

package com.wpx.simplefactory;

/**

* 测试简单工厂模式-披萨工厂

*/

public class PizzaStore {

public static void main(String[] args) {

Pizza pizza = SimplePizzaFactory.createPizza("乳酪比萨");

pizza.make();

}

}

运行结果

乳酪比萨

Process finished with exit code 0

java.text.DateFormat中的简单工厂模式

DateFormat:jdk中的一个工具类java.text.DateFormat,用来格式化一个本地日期与时间

通过源码我们可以知道DateFormat是一个抽象类(abstract),下面的源代码就是这个类里包含的方法,其实这些就是静态工厂方法,通过静态方法来提供自己的实例是完全可以的(抽象类本身不能进行实例化)。从源码可以看出getDateInstance()方法做了两件事情:

运用了多态性:由于SimpleDateFormat是DateFormat的子类,而getDateInstance()声明的类型为DateFormat而实际返回类型为子类SimpleDateFormat

使用了静态工厂方法(static):由于DateFormat是抽象类不能进行实例化,因此也就不能调用其中的普通方法(非静态方法)。因此我们必须将其声明为static,才能返回实例

通过上面做的两件事情就将具体子类的实例化过程隐藏起来了,调用者不必考虑具体子类的实例化,因为抽象类会提供它的合适子类实例

public final static DateFormat getDateInstance()

{

return get(0, DEFAULT, 2, Locale.getDefault());

}

public final static DateFormat getDateInstance(int style)

{

return get(0, style, 2, Locale.getDefault());

}

public final static DateFormat getDateInstance(int style,

Locale aLocale)

{

return get(0, style, 2, aLocale);

}

private static DateFormat get(int timeStyle, int dateStyle,

int flags, Locale loc) {

if ((flags & 1) != 0) {

if (timeStyle < 0 || timeStyle > 3) {

throw new IllegalArgumentException("Illegal time style " + timeStyle);

}

} else {

timeStyle = -1;

}

if ((flags & 2) != 0) {

if (dateStyle < 0 || dateStyle > 3) {

throw new IllegalArgumentException("Illegal date style " + dateStyle);

}

} else {

dateStyle = -1;

}

try {

// Check whether a provider can provide an implementation that's closer

// to the requested locale than what the Java runtime itself can provide.

LocaleServiceProviderPool pool =

LocaleServiceProviderPool.getPool(DateFormatProvider.class);

if (pool.hasProviders()) {

DateFormat providersInstance = pool.getLocalizedObject(

DateFormatGetter.INSTANCE,

loc,

timeStyle,

dateStyle,

flags);

if (providersInstance != null) {

return providersInstance;

}

}

return new SimpleDateFormat(timeStyle, dateStyle, loc);

} catch (MissingResourceException e) {

return new SimpleDateFormat("M/d/yy h:mm a");

}

}

总结

优点:

将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,明确了职责。

把初始化实例时的工作放到工厂里进行,使代码更容易维护。更符合面向对象的原则,面向接口编程,而不是面向实现编程。

缺点:

由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

要新增产品类的时候,就要修改工厂类的代码,违反了开放封闭原则(对扩展的开放,对修改的关闭)。

简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

java工厂模式 uml_深入浅出设计模式-简单工厂模式相关推荐

  1. android常用的工厂模式,Android的设计模式-简单工厂模式

    前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中:java 1.定义 定义一个用于建立对象的接口,让子类决定实例化哪一个类.设计模式 2.介绍 简单工厂模式属于建立型模式. 简单工厂模 ...

  2. 设计模式 - 简单工厂模式

    文章目录 设计模式 - 简单工厂模式 1.意图 2.实例 1.创建颜色接口 - 定义生产的产品是什么 2.创建颜色枚举 - 定义生产哪些类型的产品 3.根据颜色枚举创建产品 - 根据产品清单生产产品 ...

  3. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

  4. 轻松看懂java设计模式简单工厂模式

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...

  5. Java设计模式 -- 简单工厂模式(SimpleFactory)

    一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...

  6. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  7. 设计模式 -- 简单工厂模式

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初识简单 ...

  8. Spring常用设计模式--简单工厂模式

    本专栏内容参考自:咕泡学院Tom老师的<Spring5核心原理与30个类手写实战>,仅作个人学习记录使用,如有侵权,联系速删. 工厂模式的由来:   在现实生活中我们都知道,原始社会自给自 ...

  9. java工厂模式式代码_简单工厂模式及其简单Java案例代码实现

    说明:本文是<大话设计模式>的学习记录及结合网上相关信息编写,原书代码例子采用C#编写,本文采用Java稍加改写.若有不当,欢迎指正,共同进步.java 1.简单工厂模式概述:设计模式 简 ...

最新文章

  1. 生日游戏html,小朋友过生日室内游戏
  2. 体验cygwin纪实
  3. jQuery九类选择器
  4. IOS开发数据库篇—SQLite模糊查询
  5. Java类集-list
  6. spring集成mq_使用Spring Integration Java DSL与Rabbit MQ集成
  7. IOS开发之格式化日期时间的使用 编程中常见问题
  8. bool 取反_dataframe根据bool值高效地进行多重条件筛选的
  9. 自适应简约数字动画404错误页面源码
  10. linux 邮件开源工具_使用Linux和开源工具编写剧本
  11. PAT (Basic Level) Practice1007 素数对猜想
  12. Redis -- 数据库常用命令大全
  13. 数据通信与网络有这一篇就够了(网络模型篇)
  14. DELL笔记本E5400刷BIOS激活win7
  15. 特别篇:公主,快放开那只巨龙
  16. php定时发送qq消息,无需任何工具发送定时QQ消息
  17. c语言极限,C语言问题合集
  18. 手机怎么压缩图片?分享一下压缩的好方法
  19. ionic4.x仿京东 - 10.2.确认订单-去结算跳到确认订单(返回特定页面),确认订单页面布局
  20. Java——反射机制

热门文章

  1. 1622C. Set or Decrease
  2. matlab宏参赛,MATLAB杯无人机大赛 | 决赛通知!
  3. RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动
  4. mysql如何做计划任务_简单的mysql 过程计划任务
  5. 十进制小数化为二进制小数的方法是什么_十进制转成二进制的两种方式
  6. MySQL求类型为GX的平均积分_mysql基本操作
  7. cygwin和mingw的区别
  8. 增加RIL组件时编辑出现的问题
  9. sql字符串拼接_Mybatis的SqlSession执行sql过程
  10. 【转】GPS从入门到放弃(一) --- GPS基础原理