小白浅谈工厂模式

看spring的时候发现里面用了一些设计模式,但自己啥也不会,就来补一补,看的是一个youtube上面的内容,进入正题吧。

首先要解决的是为啥要引入这个模式。视频中指出,当你构建出了一个类,此时想对它实例化可能并不是这么的简单。以一个动物园为例,你设计了一个产生动物的类,但是动物有很多个,比如牛,羊,鸡等等。你当然可以通过new来不停地new出你想要得到的实例,但是动物园中有成千上万的动物,你这时候就可以利用工厂,比如说RandomGenerate()来随机生成一个动物,亦或者你想要动物园的数目较为平均,你就可以使用EqualGenerate()来生产数量相同的各种动物,以上两种方法就可以称之为不同的工厂设计模式。抽象一点说,在不同的场景下,你需要不同的逻辑来决定你的实例化对象到底是啥玩意,这就导致你的实例化并不是那么的简单,如果我有上述的两种方法来创建对象,我就可以按照我的要求来创建,比如一次创建很多的对象或者每次创建不同的对象。我们可以不用关心我们创建的具体是什么对象,所以我们只能返回这个对象的超类,比如上述例子的超类就是animal。我们new一个具体的动物,比如牛,羊,鸡,然后返回一个动物类,你当然也可以返回一个Object类,如果你愿意的话。

然后我们就可以抽象一些,将RandomGenerate()理解为一段逻辑,这里的逻辑当然就是随机生成A,B,C之类的实例,而所谓的工厂模式就是负责封装这个逻辑的。我愿称之为I1,那么EqualGenerate()我称之为I2。他们都生成相同的东西,比如抽象一点的ABC,具体一点的牛羊鸡。不同的是他们的创建方式不同。当然,这里I1,I2可以称为父类,ABC可以称为子类。I1,I2以自己独特的方式来产生子类。他产生的究竟是哪一种子类,俺并不知晓,这取决于它的逻辑,自然要返回ABC共同的父类。不过哈,万一我们有很多不同的逻辑来创建子类呢。我们不妨先创建一个生产实例(我愿称之为O1)的抽象类作为一个接口,然后让这些不同的工厂(如I1,I2这类的)来实现这些接口。这就很nice。

到这里,不妨看看书中的定义:工厂方法定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。(我的理解,这里的类是指O1,子类是指I1,I2)。

这里有一些书中的术语。

    Product ---------------------------Creator

         |                                             |

         |                                             |

Concrete Product--------Concrete Creator

(画个图不容易啊)

这里面啊 Product就是例子中的Animal,Creator就是O1

Concrete Product就是指牛羊鸡,Concrete Creator是指I1,I2。

Creator啊他要创建Product,不过啊他是个抽象类,用它来创建Product有一种空对空的感觉。

所以啊,他让Concrete Creator来创建一个Concrete Product,不过返回的是一个Product类。

为啥这么麻烦呢,因为啊,抽象代表的灵活,具体呢则代表固定,而我们创建的东西必须是具体的,为了灵活的生产不同的的具体的东西,就有了这么一套想法。

菜鸟教程里面的代码还涉及到了反射的知识,值得好好再水一篇好好聊聊,再说吧。

 

发布了2 篇原创文章 · 获赞 0 · 访问量 1805
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览