Java EE设计模式分为三种类型,共23种:

下面简单介绍工厂模式,适配器模式和模板方法模式:

一 工厂模式

  简单列一下这个模式的家族:1、静态工厂模式  2、简单工厂模式  3、工厂方法模式  4、抽象工厂模式

1、静态工厂模式

这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。

2、简单工厂模式

下面开始谈谈卖肉夹馍,得有个店:RoujiaMoStore

  1. package com.zhy.pattern.factory.a;
  2. public class RoujiaMoStore
  3. {
  4. /**
  5. * 根据传入类型卖不同的肉夹馍
  6. *
  7. * @param type
  8. * @return
  9. */
  10. public RouJiaMo sellRouJiaMo(String type)
  11. {
  12. RouJiaMo rouJiaMo = null;
  13.  
  14. if (type.equals("Suan"))
  15. {
  16. rouJiaMo = new SuanRouJiaMo();
  17.  
  18. } else if (type.equals("Tian"))
  19. {
  20. rouJiaMo = new TianRouJiaMo();
  21. } else if (type.equals("La"))
  22. {
  23. rouJiaMo = new LaRouJiaMo();
  24. }
  25.  
  26. rouJiaMo.prepare();
  27. rouJiaMo.fire();
  28. rouJiaMo.pack();
  29. return rouJiaMo;
  30. }
  31. }

然后你得有各种风味的馍馍:

  1. package com.zhy.pattern.factory.a;
  2.  
  3. public abstract class RouJiaMo
  4. {
  5. protected String name;
  6.  
  7. /**
  8. * 准备工作
  9. */
  10. public void prepare()
  11. {
  12. System.out.println("揉面-剁肉-完成准备工作");
  13. }
  14.  
  15. /**
  16. * 使用你们的专用袋-包装
  17. */
  18. public void pack()
  19. {
  20. System.out.println("肉夹馍-专用袋-包装");
  21. }
  22. /**
  23. * 秘制设备-烘烤2分钟
  24. */
  25. public void fire()
  26. {
  27. System.out.println("肉夹馍-专用设备-烘烤");
  28. }
  29. }
  1. package com.zhy.pattern.factory.a;
  2.  
  3. import com.zhy.pattern.factory.a.RouJiaMo;
  4.  
  5. /**
  6. * 辣味肉夹馍
  7. * @author jing
  8. */
  9. public class LaRouJiaMo extends RouJiaMo
  10. {
  11. public LaRouJiaMo()
  12. {
  13. this.name = "辣味肉夹馍";
  14. }
  15. }
  1. package com.zhy.pattern.factory.a;
  2. /**
  3. * 酸味肉夹馍
  4. *
  5. * @author jing
  6. */
  7. public class SuanRouJiaMo extends RouJiaMo
  8. {
  9. public SuanRouJiaMo()
  10. {
  11. this.name = "酸味肉夹馍";
  12. }
  13. }

现在这样的设计,虽然可以支持你卖肉夹馍了,但是有点问题,生产馍的种类和你的RoujiaMoStore耦合度太高了,如果增加几种风味,删除几种风味,你得一直修改sellRouJiaMo中的方法,所以我们需要做一定的修改,此时简单工厂模式就能派上用场了。

我们开始写个简单工厂,把产生馍的过程拿出来:

  1. package com.zhy.pattern.factory.a;
  2.  
  3. public class SimpleRouJiaMoFactroy
  4. {
  5. public RouJiaMo createRouJiaMo(String type)
  6. {
  7. RouJiaMo rouJiaMo = null;
  8. if (type.equals("Suan"))
  9. {
  10. rouJiaMo = new SuanRouJiaMo();
  11.  
  12. } else if (type.equals("Tian"))
  13. {
  14. rouJiaMo = new TianRouJiaMo();
  15. } else if (type.equals("La"))
  16. {
  17. rouJiaMo = new LaRouJiaMo();
  18. }
  19. return rouJiaMo;
  20. }
  21.  
  22. }

然后以组合的方式,让Store来使用:

  1. package com.zhy.pattern.factory.a;
  2.  
  3. public class RoujiaMoStore
  4. {
  5. private SimpleRouJiaMoFactroy factroy;
  6.  
  7. public RoujiaMoStore(SimpleRouJiaMoFactroy factroy)
  8. {
  9. this.factroy = factroy;
  10. }
  11.  
  12. /**
  13. * 根据传入类型卖不同的肉夹馍
  14. *
  15. * @param type
  16. * @return
  17. */
  18. public RouJiaMo sellRouJiaMo(String type)
  19. {
  20. RouJiaMo rouJiaMo = factroy.createRouJiaMo(type);
  21. rouJiaMo.prepare();
  22. rouJiaMo.fire();
  23. rouJiaMo.pack();
  24. return rouJiaMo;
  25. }
  26.  
  27. }

好了,现在你随便添加什么种类的馍,删除什么种类的馍就和Store无关了,就是么~人家只负责卖馍么~ 这就是简单工厂模式,当然了,大家也都比较熟悉。

二 适配器模式 以手机充电器为例

将一个类的接口转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以相互合作。这个定义还好,说适配器的功能就是把一个接口转成另一个接口。

代码解释哈,如题目,手机充电器一般都是5V左右吧,咱天朝的家用交流电压220V,所以手机充电需要一个适配器(降压器)

首先一部手机:Mobile.java

  1. package com.zhy.pattern.adapter;
  2.  
  3. public class Mobile
  4. {
  5. /**
  6. * 充电
  7. * @param power
  8. */
  9. public void inputPower(V5Power power)
  10. {
  11. int provideV5Power = power.provideV5Power();
  12. System.out.println("手机(客户端):我需要5V电压充电,现在是-->" + provideV5Power + "V");
  13. }
  14. }

可以看出,手机依赖一个提供5V电压的接口:

  1. package com.zhy.pattern.adapter;
  2. /**
  3. * 提供5V电压的一个接口
  4. * @author zhy
  5. *
  6. */
  7. public interface V5Power
  8. {
  9. public int provideV5Power();
  10. }

然后我们拥有的是220V家用交流电:

  1. package com.zhy.pattern.adapter;
  2.  
  3. /**
  4. * 家用220V交流电
  5. * @author zhy
  6. *
  7. */
  8. public class V220Power
  9. {
  10. /**
  11. * 提供220V电压
  12. * @return
  13. */
  14. public int provideV220Power()
  15. {
  16. System.out.println("我提供220V交流电压。");
  17. return 220 ;
  18. }
  19. }

下面我们需要一个适配器,完成220V转5V的作用:

  1. package com.zhy.pattern.adapter;
  2.  
  3. /**
  4. * 适配器,把220V电压变成5V
  5. * @author zhy
  6. *
  7. */
  8. public class V5PowerAdapter implements V5Power
  9. {
  10. /**
  11. * 组合的方式
  12. */
  13. private V220Power v220Power ;
  14.  
  15. public V5PowerAdapter(V220Power v220Power)
  16. {
  17. this.v220Power = v220Power ;
  18. }
  19.  
  20. @Override
  21. public int provideV5Power()
  22. {
  23. int power = v220Power.provideV220Power() ;
  24. //power经过各种操作-->5
  25. System.out.println("适配器:我悄悄的适配了电压。");
  26. return 5 ;
  27. }
  28.  
  29. }

最后测试,我们给手机冲个电:

  1. package com.zhy.pattern.adapter;
  2.  
  3. public class Test
  4. {
  5. public static void main(String[] args)
  6. {
  7. Mobile mobile = new Mobile();
  8. V5Power v5Power = new V5PowerAdapter(new V220Power()) ;
  9. mobile.inputPower(v5Power);
  10. }
  11. }

输出:

现有类:我提供220V交流电压。
    适配器:我悄悄的适配了电压。
    手机(客户端):我需要5V电压充电,现在是-->5V

可以看出,我们使用一个适配器完成了把220V转化了5V然后提供给手机使用,且我们使用了组合(OO设计原则),原有的手机,以及200V电压类都不需要变化,且手机(客户端)和220V(被适配者)完全解耦。

三 模版方法模式 展现程序员的一天

定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。

简单看下定义,模版方法定义了一个算法的步骤,并且允许子类为一个或多个步骤提供实现。定义还算清晰,下面来个例子展示下本公司的上班情况(纯属娱乐,如有雷同,请对号入座)。简单描述一下:本公司有程序猿、测试、HR、项目经理等人,下面使用模版方法模式,记录下所有人员的上班情况:

首先来个超类,超类中定义了一个workOneDay方法,设置为作为算法的骨架:

  1. package com.zhy.pattern.template;
  2.  
  3. public abstract class Worker
  4. {
  5. protected String name;
  6.  
  7. public Worker(String name)
  8. {
  9. this.name = name;
  10. }
  11.  
  12. /**
  13. * 记录一天的工作
  14. */
  15. public final void workOneDay()
  16. {
  17.  
  18. System.out.println("-----------------work start ---------------");
  19. enterCompany();
  20. computerOn();
  21. work();
  22. computerOff();
  23. exitCompany();
  24. System.out.println("-----------------work end ---------------");
  25.  
  26. }
  27.  
  28. /**
  29. * 工作
  30. */
  31. public abstract void work();
  32.  
  33. /**
  34. * 关闭电脑
  35. */
  36. private void computerOff()
  37. {
  38. System.out.println(name + "关闭电脑");
  39. }
  40.  
  41. /**
  42. * 打开电脑
  43. */
  44. private void computerOn()
  45. {
  46. System.out.println(name + "打开电脑");
  47. }
  48.  
  49. /**
  50. * 进入公司
  51. */
  52. public void enterCompany()
  53. {
  54. System.out.println(name + "进入公司");
  55. }
  56.  
  57. /**
  58. * 离开公司
  59. */
  60. public void exitCompany()
  61. {
  62. System.out.println(name + "离开公司");
  63. }
  64.  
  65. }

定义了一个上班(算法)的骨架,包含以下步骤:

a、进入公司

b、打开电脑

c、上班情况

d、关闭电脑

e、离开公司

可以看到,a、b、d、e我们在超类中已经实现,子类仅实现work这个抽象方法,记录每天的上班情况。下面各类人物入场:

程序猿:

  1. package com.zhy.pattern.template;
  2.  
  3. public class ITWorker extends Worker
  4. {
  5.  
  6. public ITWorker(String name)
  7. {
  8. super(name);
  9. }
  10.  
  11. @Override
  12. public void work()
  13. {
  14. System.out.println(name + "写程序-测bug-fix bug");
  15. }
  16.  
  17. }

测试人员:

  1. package com.zhy.pattern.template;
  2.  
  3. public class QAWorker extends Worker
  4. {
  5.  
  6. public QAWorker(String name)
  7. {
  8. super(name);
  9. }
  10.  
  11. @Override
  12. public void work()
  13. {
  14. System.out.println(name + "写测试用例-提交bug-写测试用例");
  15. }
  16.  
  17. }

项目经理:

  1. package com.zhy.pattern.template;
  2.  
  3. public class ManagerWorker extends Worker
  4. {
  5.  
  6. public ManagerWorker(String name)
  7. {
  8. super(name);
  9. }
  10.  
  11. @Override
  12. public void work()
  13. {
  14. System.out.println(name + "打dota...");
  15. }
  16.  
  17. }

下面我们测试下:

  1. package com.zhy.pattern.template;
  2.  
  3. public class Test
  4. {
  5. public static void main(String[] args)
  6. {
  7.  
  8. Worker it1 = new ITWorker("鸿洋");
  9. it1.workOneDay();
  10. Worker pm = new ManagerWorker("坑货");
  11. pm.workOneDay();
  12.  
  13. }
  14. }

输出结果:

  1. -----------------work start ---------------
  2. 鸿洋进入公司
  3. 鸿洋打开电脑
  4. 鸿洋写程序-测bug-fix bug
  5. 鸿洋关闭电脑
  6. 鸿洋离开公司
  7. -----------------work end ---------------
  8.  
  9. -----------------work start ---------------
  10. 坑货进入公司
  11. 坑货打开电脑
  12. 坑货打dota...
  13. 坑货关闭电脑
  14. 坑货离开公司
  15. -----------------work end ---------------

原文:https://blog.csdn.net/lmj623565791/article/details/24460585

Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)的更多相关文章

  1. 单例模式——Java EE设计模式解析与应用

    单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图               ...

  2. (转)Java经典设计模式(3):十一种行为型模式(附实例和详解)

    原文出处: 小宝鸽 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J ...

  3. java反射机制的简单介绍

    参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...

  4. Java泛型使用的简单介绍

    目录 一. 泛型是什么 二. 使用泛型有什么好处 三. 泛型类 四. 泛型接口 五. 泛型方法 六. 限定类型变量 七. 泛型通配符 7.1 上界通配符 7.2 下界通配符 7.3 无限定通配符 八. ...

  5. Java Linked集合的简单介绍和常用方法的使用

    LinkedList的简单介绍 java.util.LinkedList 集合数据存储的结构是链表结构.LinkedList是一个双向链表在实际开发中,对一个集合元素的添加和删除,经常涉及到首尾操作, ...

  6. (转)《JAVA与模式》之模板方法模式

    该文章转自:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 在阎宏博士的<JAVA与模式>一书中开头 ...

  7. 《JAVA与模式》之模板方法模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  8. 设计模式(七):Adapter 适配器模式 -- 结构型模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

  9. 《JavaScript设计模式与开发实践》读书笔记之模板方法模式

    1. 模板方法模式 1.1 面向对象方式实现模板方法模式 以泡茶和泡咖啡为例,可以整理为下面四步 把水煮沸 用沸水冲泡饮料 把饮料倒进杯子 加调料 首先创建一个抽象父类来表示泡一杯饮料 var Bev ...

随机推荐

  1. 记录一下最近的解决的坑爹bug

    最近解决的bug长得都很别致啊,记录一下 一 :天气插件引用报403 项目里有一个天气插件引用一直报403 后来确定原因是headers里缺少referer源,无法访问资源的服务器,再后来又发现项目引 ...

  2. “妄”眼欲穿之CSS 居中问题

    妄:狂妄: 不会的东西只有怀着一颗狂妄的心,假装能把它看穿吧. 作为一个什么都不会的小白,为了学习,特别在拿来主义之后写一些对于某些css布局的总结,进一步加深对知识的记忆.知识是人类的共同财富,中华 ...

  3. 4 - BFS & Topological Algorithm

    615. Course Schedule https://www.lintcode.com/problem/course-schedule/description?_from=ladder&& ...

  4. LOB

    一,LOB介绍 1,概念 LOB 是指用来存储大对象的数据类型,一般说LOB只是泛指,具体有BLOB,CLOB,NCLOB,BFILE.   根据你数据库的设置,一个LOB可以存储的最大大小从8TB到 ...

  5. LeetCode--031--下一个排列(java)*

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  6. .net邮件发送帮助类

    代码如下: using System; using System.Collections.Generic; using System.Text; using System.Configuration; ...

  7. python之asyncio三种应用方法

    1.直接使用asyncio.run方法2.同步的效果,用await调用函数3.创建任务(asyncio.create_task),并发运行任务(await asyncio.gather) import ...

  8. swoole框架和其所涉及的协议

    网络知识基础 OSI协议 :应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 tcp通信 TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道(三次握手.四次挥手). ...

  9. 将对象转成 json 以及 将字符串 hash(SHA1) 加密

    如下: /// <summary> /// 生成 Json /// </summary> /// <param name="obj"></ ...

  10. SqlServer 查看最近执行过的语句

    查看系统中最近执行的语句 ST.text AS '执行的SQL语句', QS.execution_count AS '执行次数', QS.total_elapsed_time AS '耗时', QS. ...