定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

类型:创建类模式

类图:

工厂方法模式代码

interface IProduct {public void productMethod();
}class Product implements IProduct {public void productMethod() {System.out.println("产品");}
}interface IFactory {public IProduct createProduct();
}class Factory implements IFactory {public IProduct createProduct() {return new Product();}
}public class Client {public static void main(String[] args) {IFactory factory = new Factory();IProduct prodect = factory.createProduct();prodect.productMethod();}
}

工厂模式:

首先须要说一下工厂模式。工厂模式依据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经经常使用到的一种模式。它的主要长处有:

  • 能够使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比較复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,仅仅需依赖工厂就可以得到自己想要的产品。
  • 对调用者屏蔽详细的产品类。假设使用工厂模式,调用者仅仅关心产品的接口就能够了,至于详细的实现,调用者根本无需关心。即使变更了详细的实现,对调用者来说没有不论什么影响。
  • 减少耦合度。产品类的实例化通常来说是非常复杂的,它须要依赖非常多的类,而这些类对于调用者来说根本无需知道,假设使用了工厂方法,我们须要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。

工厂方法模式:

       通过工厂方法模式的类图能够看到,工厂方法模式有四个要素:

  • 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
  • 工厂实现。在编程中,工厂实现决定怎样实例化产品,是实现扩展的途径,须要有多少种产品,就须要有多少个详细的工厂实现。
  • 产品接口。产品接口的主要目的是定义产品的规范,全部的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。相同,产品接口也能够用抽象类来取代,但要注意最好不要违反里氏替换原则。
  • 产品实现。实现产品接口的详细类,决定了产品在client中的详细行为。

前文提到的简单工厂模式跟工厂方法模式极为相似,差别是:简单工厂仅仅有三个要素,他没有工厂接口,而且得到产品的方法通常是静态的。由于没有工厂接口,所以在工厂实现的扩展性方面稍弱,能够算所工厂方法模式的简化版,关于简单工厂模式,在此一笔带过。

适用场景:

无论是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。

首先,作为一种创建类模式,在不论什么须要生成复杂对象的地方,都能够使用工厂方法模式。有一点须要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是仅仅须要通过new就能够完毕创建的对象,无需使用工厂模式。假设使用工厂模式,就须要引入一个工厂类,会添加系统的复杂度。

其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品须要添加依赖关系时,能够考虑使用工厂模式。将会大大减少对象之间的耦合度。

再次,因为工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完毕,扩展性比較好。也就是说,当须要系统有比較好的扩展性时,能够考虑工厂模式,不同的产品用不同的实现工厂来组装。

典型应用

要说明工厂模式的长处,可能没有比组装汽车更合适的样例了。场景是这种:汽车由发动机、轮、底盘组成,如今须要组装一辆车交给调用者。假如不使用工厂模式,代码例如以下:

class Engine {public void getStyle(){System.out.println("这是汽车的发动机");}
}
class Underpan {public void getStyle(){System.out.println("这是汽车的底盘");}
}
class Wheel {public void getStyle(){System.out.println("这是汽车的轮胎");}
}
public class Client {public static void main(String[] args) {Engine engine = new Engine();Underpan underpan = new Underpan();Wheel wheel = new Wheel();ICar car = new Car(underpan, wheel, engine);car.show();}
}

能够看到,调用者为了组装汽车还须要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关的,严重违反了迪米特法则,耦合度太高。而且很不利于扩展。另外,本例中发动机、底盘和轮胎还是比較详细的,在实际应用中,可能这些产品的组件也都是抽象的,调用者根本不知道如何组装产品。假如使用工厂方法的话,整个架构就显得清晰了很多。

interface IFactory {public ICar createCar();
}
class Factory implements IFactory {public ICar createCar() {Engine engine = new Engine();Underpan underpan = new Underpan();Wheel wheel = new Wheel();ICar car = new Car(underpan, wheel, engine);return car;}
}
public class Client {public static void main(String[] args) {IFactory factory = new Factory();ICar car = factory.createCar();car.show();}
}

使用工厂方法后,调用端的耦合度大大减少了。而且对于工厂来说,是能够扩展的,以后假设想组装其它的汽车,仅仅须要再添加一个工厂类的实现就能够。不管是灵活性还是稳定性都得到了极大的提高。

转载于:https://www.cnblogs.com/yxwkf/p/3792534.html

23种设计模式(2):工厂方法模式相关推荐

  1. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之工厂方法模式

    · 工厂方法模式在王者荣耀中的应用 · 一.简述 王者荣耀这款游戏目前一共有100位英雄,游戏设计师根据英雄技能.属性.天赋等因素,将英雄划分为射手.辅助.打野.法师.坦克.战士等职业. 在本实例中, ...

  2. 23种设计模式之工厂方法模式

    工厂方法模式的定义 定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类 工厂方法模式的通用类图: 其中 Product 负责产品的共性,实现对事物最抽 ...

  3. 23种设计模式之工厂方法模式(黑马程序员)

    工厂方法模式 一.概述 二.结构 三.实现 四.总结 在最后 一.概述 定义一个用户创建对象的工厂(接口),让接口的子类决定去实例化哪个对象,依赖其抽象编程.即工厂方法使一个类的实例化延迟到其工厂的子 ...

  4. 一天一种设计模式之六-----工厂方法模式

    2019独角兽企业重金招聘Python工程师标准>>> 一.工厂方法模式 工厂方法模式属于创建型模式. 工厂方法模式定义:定义一个用于创建对象的借口,让子类决定实例化哪一个类.工厂方 ...

  5. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  6. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  7. 备战面试日记(3.4) - (设计模式.23种设计模式之行为型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.12 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文 ...

  8. 设计模式之工厂方法模式(创建型)

    一.模式定义 工厂方法模式:又称工厂模式,也叫虚拟构造器模式,属于构建型设计模式,工厂方法模式是在简单工厂模式上进行拓展,生产产品的过程由具体工厂类实现,基类只实现接口,这使得工厂方法模式可以在不修改 ...

  9. 设计模式之工厂方法模式应用例题

    设计模式之工厂方法模式应用例题 题目描述 类结构图及相关说明 程序代码 运行结果 题目描述 现需要设计一个程序来读取多种不同类型的图片格式,针对每一种图片格式都设计一个图片读取器(ImageReade ...

  10. 设计模式:工厂方法模式(Factory method)

    设计模式:工厂方法模式(Factory method) 一.问题 在前一章中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨. ...

最新文章

  1. [置顶] 决策树绘图(二)
  2. WebService在开发中的实际问题
  3. 【Android 逆向】Android 中常用的 so 动态库 ( 拷贝 /system/lib/ 中的 Android 系统 so 动态库 )
  4. D2Admin 7月份更新内容:cli3以及更方便的全局控制等
  5. clock_gettime获取时间
  6. Zephyr OS 内核篇: 内核链表
  7. android EventBus的简单使用
  8. 分立元件封装尺寸及PCB板材工艺与设计实例
  9. 下面以Button组件为例,开始FLEX皮肤制作的入门。
  10. Tomcat部分目录作用
  11. 智慧油气田可视化,打造油气田管控的“最强大脑”
  12. python可以用于工业机器人编程与操作_如何实现工业机器人编程抓取
  13. [Angular] - 01 Architecture and workflow
  14. 分享一篇前端大佬关于前端职业规划的建议
  15. 谢惠民恽自求易法槐钱定边数学分析习题课讲义第2版上册全部思考题练习题参考题解答...
  16. rls算法matlab实现,第5章基于RLS算法的数据预测与MATLAB实现MATLAB实现.PDF
  17. 抖音究竟是通过什么让我男朋友他爸成功刷到了我妈?,历经30天
  18. 使用phpqrcode.php生成二维码并合并到背景图片上
  19. oracle 中的nvl函数使用
  20. springboot打成jar后获取resources下文件失败, cannot be resolved to absolute file path because it does not resid

热门文章

  1. 【讲座预告】Processing Learner Texts: from Annotation to ...
  2. 初学者|一起来看看词性标注
  3. 深度学习之激活函数详解
  4. 什么是迁移学习 (Transfer Learning)?这个领域历史发展前景如何?【文末彩蛋】...
  5. 20200318_抓取51job招聘数据存数据库
  6. 【每日算法Day 95】美团笔试题:四面体方案个数
  7. pytorch中lstm用法详解(二)
  8. 从门户到搜索:谁为百度打工?
  9. Android技术专家 高焕堂 推荐这本书
  10. Python入门之类与面向对象(一)