码迷,mamicode.com
首页 > 其他好文 > 详细

【设计模式】工厂模式

时间:2019-07-20 17:23:31      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:设计   html   信息   info   的区别   mamicode   stack   开放   工厂   

前言

这篇博客将包括两种设计模式,一种是工厂模式,一种是抽象工厂模式。不管是哪一种设计模式,本质上在解决的问题是对象创建的问题。工厂,可以是简简单单的一个函数,也可以是一个有具体实现的类,也可以是一个抽象的类。它们共同的特点都是在创建对象。工厂,根据函数输入,或者自身的类型,决定创建抽象类的一个/一族子类对象。

变的是什么呢?对象的创建
不变的是什么呢?总有一个对象要被创建出来:工厂方法的调用

简单工厂

简单工厂往往就是一个函数,当然这个函数需要一个类承载它。简单工厂的这个函数,输入是创建类需要的信息,输出是一个抽象类。函数内部是根据信息去决定创建哪一个抽象类的子类。
技术图片

工厂模式

在工厂模式中,有一个抽象的工厂类,这个类定义了创建对象的抽象方法,由具体的工厂去实现如何创建对象。有一个抽象的Product类,这个Product类提供了一些抽象方法,提供给Product的使用者调用,具体实现由子类来完成。

下图只是工厂方法的一种诠释,核心在于工厂方法。当然工厂类不一定需要productDoSomething()方法,在要使用这个Product的地方的时候,调用工厂类的createProduct()返回一个对象也是可以的。

技术图片

分析

当一个类A依赖另一个抽象类B的时候,需要根据一些信息去创建B的子类对象,每次增加了新的B的子类,都要去"修改"A中创建子类的代码。于是,为了将变的部分分离,将创建子类对象这一变的部分抽取出来,形成一个抽象的createXXX方法。这样,当增加B的子类的时候,如果需要使用,就去"扩展"A,实现createXXX,不需要改动A和B。

这个模式符合开闭原则,并且将A不再需要了解B的具体子类。

代码分析

这里分析[4]中提到的,iterator()是一个工厂方法,它的UML图如下,以下列出来的仅仅是冰山一角。容器的种类那么多,对应的容器的迭代器也很多。那么这么多的容器和迭代器该如何正确管理呢?答案还是:对扩展开放,对修改封闭。

所有的可迭代的容器去实现Iterable中iterator()方法,这个方法让每个容器具体的去创建一个迭代器类。在ArrayList实现了一个内部类Itr,这个Itr就是ArrayList的实现了Iterator接口的迭代器。其他的可迭代的类,实现iterator()的接口类似如此。
技术图片

抽象工厂

抽象工厂模式和工厂模式的区别在于抽象Product类的规模。工厂模式,解决的是一个Product类。抽象工厂模式,解决的是一族Product类。这一族类是有关联的,它们之间的合作需要来自同一个类。

抽象工厂的一个应用场景是GUI组件。GUI的按钮,文本,布局,容器等,在各个平台上的实现是不一样的,那么可以对每个平台创建一个具体的工厂,来解决GUI组件的创建。一旦工厂被创建出来,工厂的使用者不需要关心创建出来的组件之间是否兼容,因为只要它们来自同一个工厂,都默认是兼容的。

参考

1,https://refactoring.guru/design-patterns
2,https://www.runoob.com/design-pattern/design-pattern-intro.html
3,Head First设计模式
4,Android源代码设计模式解析与实战
5,https://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries

【设计模式】工厂模式

标签:设计   html   信息   info   的区别   mamicode   stack   开放   工厂   

原文地址:https://www.cnblogs.com/zhouzekai/p/11218078.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!