模式设计学习——工厂设计与策略设计


文章目录

  • 模式设计学习——工厂设计与策略设计
  • 前言
  • 一、工厂模式与策略模式是什么?
  • 二、实现
    • 1.工厂模式
    • 2.策略模式
  • 总结

前言

记录笔者在工作学习中总结的知识点,如有需要完善之处欢迎留言评论指导。


一、工厂模式与策略模式是什么?

1.工厂模式定义:工厂模式是是 Java 中最常用的设计模式之一,是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式,属于创建型模式。
2.策略模式定义:在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

二、实现

1.工厂模式

代码如下(示例):

步骤一
创建一个接口。

public interface People {void firstGear();void secondGear();void thirdGear();
}

步骤二
创建实现接口的实体类。

LuFei.java
public class LuFei implements People{private static final String roleName = "路飞";@Overridepublic void firstGear() {System.out.println(roleName + ":----橡胶手枪----");}@Overridepublic void secondGear() {System.out.println(roleName + ":----橡胶火箭----");}@Overridepublic void thirdGear() {System.out.println(roleName + ":----尼卡变身----");}
}
KaiDuo.java
public class KaiDuo implements People{private static final String roleName = "兽王凯多";@Overridepublic void firstGear() {System.out.println(roleName + ":----雷鸣八卦----");}@Overridepublic void secondGear() {System.out.println(roleName + ":----热息----");}@Overridepublic void thirdGear() {System.out.println(roleName + ":----最强之力----");}
}
SuoLong .java
public class SuoLong implements People{private static final String roleName = "索隆";@Overridepublic void firstGear() {System.out.println(roleName + ":----一刀流居合 狮子歌歌----");}@Overridepublic void secondGear() {System.out.println(roleName + ":----二刀流 居合 罗生门----");}@Overridepublic void thirdGear() {System.out.println(roleName + ":----三刀流奥义 三千世界----");}
}

步骤 3
创建一个工厂,生成基于给定信息的实体类的对象。

PeopleFactory.java
public class PeopleFactory {public People getPeople(String peopleType) {if (peopleType == null) {return null;}if(peopleType.equalsIgnoreCase("LuFei")){return new LuFei();} else if(peopleType.equalsIgnoreCase("KaiDuo")){return new KaiDuo();} else if(peopleType.equalsIgnoreCase("SuoLong")){return new SuoLong();}return null;}
}

步骤 4
使用该工厂,通过传递类型信息来获取实体类的对象。

FactoryPatternDemo.java
public class FactoryPatternDemo {public static void main(String[] args) {PeopleFactory peopleFactory = new PeopleFactory();//获取 LuFei 的对象,并调用它的 firstGear 方法People luFei = peopleFactory.getPeople("LuFei");//调用 LuFei 的 firstGear 方法luFei.firstGear();//获取 KaiDuo 的对象,并调用它的 firstGear 方法People kaiDuo = peopleFactory.getPeople("KaiDuo");//调用 KaiDuo 的 firstGear 方法kaiDuo.firstGear();//获取 SuoLong 的对象,并调用它的 firstGear 方法People suoLong = peopleFactory.getPeople("SuoLong");//调用 SuoLong 的 firstGear 方法suoLong.firstGear();}
}

运行结果:

路飞:----橡胶手枪----
兽王凯多:----雷鸣八卦----
索隆:----一刀流居合 狮子歌歌----

2.策略模式

代码如下(示例):
步骤一、步骤二如同工厂模式,我们直接开始步骤三。

步骤三
创建 Context 类。

Context.java
public class Context {private People people;public Context(People people){this.people = people;}public Context(String name){if(name.equals("LuFei")){this.people = new LuFei();}else if(name.equals("KaiDuo")){this.people = new KaiDuo();}else if(name.equals("SuoLong")){this.people = new SuoLong();}}public void run(){people.firstGear();people.secondGear();people.thirdGear();}}

步骤四
使用 Context 来查看当它改变策略 Strategy 时的行为变化。

StrategyPatternDemo.java
public class StrategyPatternDemo {public static void main(String[] args) {Context luContext = new Context("LuFei");Context kaiContext = new Context("KaiDuo");Context suoContext = new Context("SuoLong");System.out.print("路飞释放技能" ); luContext.run();System.out.print("索隆释放技能" ); suoContext.run();System.out.print("凯多抵挡" ); kaiContext.run();}
}

运行结果:

路飞释放技能路飞:----橡胶手枪----
路飞:----橡胶火箭----
路飞:----尼卡变身----
索隆释放技能索隆:----一刀流居合 狮子歌歌----
索隆:----二刀流 居合 罗生门----
索隆:----三刀流奥义 三千世界----
凯多抵挡兽王凯多:----雷鸣八卦----
兽王凯多:----热息----
兽王凯多:----最强之力----

总结

简单来说工厂模式是可以让使用对象的人去避免创建对象,工厂把对象给你了,你只管使用就可以了,而不必管这些对象究竟如何创建及如何组织的。

策略模式就是根据用户提供的策略,在不同的场景中,该行为有不同的实现算法。策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。缺点是用户必须知道所有的策略类,可以通过和工厂模式来结合使用,不过也有弊端,并且每个策略都需要一个策略类,策略一多类也就非常多了。以前使用DBUtils时候传入不同的参数然后就可以有不同的封装方式返回object或者list就是就是的策略模式。

借鉴链接:
链接: 菜鸟教程.
个人理解简单工厂模式和策略模式的区别.

模式设计学习——工厂设计与策略设计相关推荐

  1. 看不见的竞争-谈谈策略设计

    看不见的竞争 - 什么是风控 前文是引言,风控涉及的层面特别广泛,那么今天说一个相对细分的层面,产品及运营的策略设计,当然,策略设计不能说完全是为风控服务的,但风控在这里的比重是非常巨大的. 一些未入 ...

  2. UI设计学习路线是什么?

    UI设计学习路线是什么?如果说十大挣钱行业UI设计师必占一席之地.很多UI设计师也可以说是潮流的气息于一身,导致很多刚毕业的同学参加UI设计培训也要当一名UI设计师.那么UI设计都要学习什么?UI设计 ...

  3. 设计模式学习总结(一)——设计原则与UML统一建模语言

    目录 一.概要 1.1.设计模式定义 1.2.设计模式分类 1.3.设计模式书籍 二.UML统一建模语言 2.1.UML分类 2.2.类图 2.2.1.关联 2.2.2.聚合/组合 2.2.3.依赖 ...

  4. 游戏设计梦工厂读书笔记(三)

    玩家 游戏是一种体验式设计,玩家在参与游戏后就进入了魔法圈.在魔法圈中,游戏的规则产生了一定的权力并给予玩家一些可能性. 在游戏规则的约束下,我们可以做一些我们从来不会想到的事,例如:射击.杀戮.背叛 ...

  5. 创新案例|市值$400亿的设计平台Canva的增长策略

    澳大利亚在线平面设计工具「Canva」目前估值已达 400 亿美元,成为全球最有价值初创公司之一.是什么让Canva实现如此高速的增长?本文将通过研究Canva的产品体验创新.付费搜索和搜索引擎优化. ...

  6. UE4场景设计学习教程

    视频:MPEG4视频(H264) 1920×1080 25fps 1400kbps |音频:AAC 44100Hz立体声128kbps 语言:西班牙语+中英文字幕(根据原英文字幕机译更准确) |时长: ...

  7. SQL Server 2008备份策略设计下(六)

    上一篇博文探讨了各种恢复模式和备份类型,这一节继续来探讨如何设计备份策略.设计一个数据库的最佳备份策略,会面临如何选择使用哪种恢复模式的问题,因为恢复模式控制着备份和还原的行为.一般来讲,简单恢复模式 ...

  8. 【吐血推荐】领域驱动设计学习输出

    一.Hello DDD 刚开始接触学习「DDD - 领域驱动」的时候,我被各种新颖的概念所吸引:「领域」.「领域驱动」.「子域」.「聚合」.「聚合根」.「值对象」.「通用语言」.....总之一大堆有关 ...

  9. 不固定图片宽高瀑布流_APP设计学习:瀑布流式的产品UI设计

    看到好的APP产品UI设计,真是忍不住想要停留几秒,慢慢来欣赏.今天学堂君收集了近期不错的优质的APP设计作品,看起来极舒服的UI界面,分享给大家.这一期的重点学习:在APP界面设计当中,如何应用瀑布 ...

最新文章

  1. 一种互补间歇振荡器工作电压
  2. FPGA之道(47)时钟及时钟域
  3. POJ 1821 Fence ★(单调队列优化DP)
  4. SpringBoot中使用thymeleaf模板时select下拉框怎样查询数据库赋值
  5. 人脸情绪识别系统第一次迭代总结
  6. 为线程命名——prctl
  7. [渝粤教育] 湘潭大学 计算机组成与体系结构 参考 资料
  8. python解释器配置_Python解释器的配置
  9. HTML静态网页作业-网上花店4个页面(HTML+CSS+JS)
  10. 计算机cad图块,CAD图块的操作及概念
  11. 关于Exception出现application exception overridden by commit exception
  12. opencv切割视频:把长视频切割成固定时间的短视频
  13. 剪刀石头布java流程图_青岛能源所基于“剪刀石头布”策略实现快速多轮基因编辑...
  14. 还不错的微信活码程序源码+功能强大
  15. SpringSecurity详细介绍RememberMe功能
  16. 七牛---借助第三方平台实现移动直播
  17. 测试发布,无图版~《Windows Phone 7.5本质论》第一章
  18. python中安装wordcloud 出现cl.exe failed with exit status 2问题解决
  19. Michael Kors 完成了对 Versace 的收购,集团还正式改名成了 Capri
  20. 关于数据库触发器(trigger)的简单使用操作

热门文章

  1. 如何使用阿杜(Arduino)测试板编程HC-05蓝牙模块?
  2. Java微服务开发指南-Java环境下的微服务
  3. jps: command not found原因
  4. Word图标显示异常空白解决方案
  5. 团队中“螃蟹”太多,如何解决?
  6. MAC m1经常死机问题
  7. 史上最口语化Arduino入门教程——1.2数字I/O口
  8. 蓝桥杯C/C++每日一练之回文数
  9. 别写秒杀系统了,我告诉你消息管理平台实现原理吧
  10. ubuntu中使用默认apt 安装的java配置JAVA_HOME