转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895


工厂方法模式(Factory Method)

工厂方法:顾名思义,就是调用工厂里的方法来生产对象(产品)的。
工厂方法实现方式有3种:

一、普通工厂模式。就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

1、uml建模图:

2、代码实现

/*** 演示样例(一):普通工厂方法* * 缺点:假设传递的字符串出错,则不能正确创建对象*/
interface Sender {public void send();
}class EmailSender implements Sender {@Overridepublic void send() {System.out.println("使用电子邮箱发送...");}}class SmsSender implements Sender {@Overridepublic void send() {System.out.println("使用短信发送...");}}/*** 产品工厂*/
class SendFactory {public Sender produceSender(String type) {if ("email".equals(type)) {return new EmailSender();} else if ("sms".equals(type)) {return new SmsSender();} else {System.out.println("没有这样的类型...");return null;}}
}/*** client測试类* * @author Leo*/
public class Test {public static void main(String[] args) {// 创建工厂SendFactory sendFactory = new SendFactory();// 生产产品Sender sender = sendFactory.produceSender("email");// 发货sender.send();}}

二、多个工厂方法模式。是对普通工厂方法模式的改进,在普通工厂方法模式中,假设传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

1、uml建模图:

2、代码实现

/*** 演示样例(二):多个工厂方法* * 长处:多个工厂方法模式是提供多个工厂方法,分别创建对象*/
interface Sender {public void send();
}class EmailSender implements Sender {@Overridepublic void send() {System.out.println("使用电子邮箱发送...");}}class SmsSender implements Sender {@Overridepublic void send() {System.out.println("使用短信发送...");}}/*** 不同方法分别生产对应的产品*/
class SendFactory {public Sender produceEmail() {return new EmailSender();}public Sender produceSms() {return new SmsSender();}
}/*** client測试类* * @author Leo*/
public class Test {public static void main(String[] args) {// 创建工厂SendFactory sendFactory = new SendFactory();// 生产产品Sender senderEmail = sendFactory.produceEmail();// 发货senderEmail.send();}}

三、静态工厂方法模式。将上面的多个工厂方法模式里的方法置为静态的,不须要创建实例,直接调用就可以。

1、uml建模图:

2、代码实现

/*** 演示样例(三):静态工厂方法* * 长处:多个工厂方法模式是提供多个工厂方法,分别创建对象*/
interface Sender {public void send();
}class EmailSender implements Sender {@Overridepublic void send() {System.out.println("使用电子邮箱发送...");}}class SmsSender implements Sender {@Overridepublic void send() {System.out.println("使用短信发送...");}}/*** 静态工厂:不同实例化工厂* * 不同方法分别生产对应的产品*/
class SendFactory {public static Sender produceEmail() {return new EmailSender();}public static Sender produceSms() {return new SmsSender();}
}/*** client測试类* * @author Leo*/
public class Test {public static void main(String[] args) {// 直接生产产品Sender senderEmail = SendFactory.produceEmail();// 发货senderEmail.send();}}

四、总结

整体来说,凡是出现了大量的产品须要创建,而且具有共同的接口时,能够通过工厂方法模式进行创建。在以上的三种模式中,第一种假设传入的字符串有误,不能正确创建对象,第三种相对于另外一种,不须要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式

转载于:https://www.cnblogs.com/mengfanrong/p/4222197.html

Java设计模式菜鸟系列(四)工厂方法模式建模与实现相关推荐

  1. Java设计模式【之】工厂方法模式【场景:制作咖啡】

    Java设计模式[之]工厂方法模式[场景:制作咖啡] 1.工厂方法 1.1.工厂方法模式 1.2.具体需求(生产多种咖啡) 2.代码实现 2.1.代码结构 2.2.咖啡抽象类 2.3.一种咖啡 2.4 ...

  2. 通往架构师之路系列之Java设计模式(二)工厂方法模式

    前言 参考:虫洞栈 工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类 决定实例化对象的类型. 这种设计模式也是 Java 开发中最常见的一种模式,它的主要意图 ...

  3. Java设计模式(一) -- 工厂方法模式

    java的设计模式大体上分为三大类: •创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. •结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  4. 设计模式系列之 工厂方法模式

    定义 定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行. 该定义是对生产者一方的描述,涉及四种角色,包括接口.接口实现类.被实例化的类.抽象产品(隐 ...

  5. 北风设计模式课程---2、工厂方法模式

    北风设计模式课程---2.工厂方法模式 一.总结 一句话总结: 工厂方法模式相对于简单工厂模式只是修改了 [工厂核心类-将它变成接口],具体的创建产品的工作交给[工厂核心类的子类] 满足了开闭原则:不 ...

  6. 跟着学设计模式 (1)— 工厂方法模式

    跟着学设计模式 (1)- 工厂方法模式 前提 工厂方法模式介绍 实现模拟发奖多种商品为例 代码实现 工厂模式优化代码 前提 好看的代码千篇一律,恶心的程序升职加薪. 谁发明了设计模式? 设计模式的概念 ...

  7. 对设计模式的总结之工厂方法模式和抽象工厂模式

    前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...

  8. 第二部分:二十三种设计模式解读——什么是工厂方法模式

    二十三种设计模式解读--什么是工厂方法模式 author:陈镇坤27 日期:2022年2月10日 修改日期:2022年6月23日 文章目录 二十三种设计模式解读--什么是工厂方法模式 一.工厂方法模式 ...

  9. Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)

    从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...

最新文章

  1. VCL标准化皮肤组件Alphacontrols发布v10.27
  2. 详细讲解设计LOGO思维方式和方法【转】
  3. 快速安装第三方库的指令——解决第三方库安装超时问题
  4. 利用XML实现通用WEB报表打印 卢彦
  5. 摄影测量--共线方程
  6. 无心剑英译朱自清《匆匆》
  7. plc与python之间实现通信的结构框图_Python设计模式 - UML - 通信图(Communication Diagram)...
  8. Monkey测试:日志信息分析
  9. 慕课马尔萨斯人口模型
  10. Germany Gone with honour - 德国队 带着胜利离开
  11. 信息学奥赛一本通(c++):1336:【例3-1】找树根和孩子
  12. 药物不良反应数据库信息的下载
  13. stm32f405rgt6与as5048a的SPI通信问题
  14. 第 5 章 函数和代码复用
  15. POI报错_org.apache.xmlbeans.impl.values.XmlValueDisconnectedException
  16. matlab上确界距离,习题课PPT课件.ppt
  17. RAD Studio 安装之后出现“配置系统未能初始化“
  18. java 适配器模式示例
  19. 正运动EtherCAT总线控制器在 并联机械手上的应用
  20. 2022年 IACA 卓越货币奖 获奖及入围名单

热门文章

  1. 《LeetCode力扣练习》第31题 下一个排列 Java
  2. python requests_Python爬虫之requests模块
  3. 防爆计算机最新报价,防爆计算机 工厂直销 价格优惠升级方便外形轻巧KJD127防爆计算机...
  4. opencv和HALCON坐标系的不同
  5. gen_caltab自治标定板
  6. linux halt函数,常用Linux命令 reboot halt shutdown passwd vlock exit等
  7. day13 内置函数一
  8. react中高阶组件
  9. Determine destination location of apt-get install package?
  10. UrlUtils工具类,Java URL工具类,Java URL链接工具类