我们其实听过很多设计模式,什么单例模式,注册树模式等等。这些语言的设计模式其实是为了一些特定场景而出现的解决方案,所以这就是为什么我们不仅仅要知道设计模式的怎么用,更要知道什么时候用,这个时候概念性的东西理解越透,我们代码层面的深度也就越深。
之前面试过一些phper,有的三四年的经验依旧对设计模式不熟悉。我也喜欢逛程序员的论坛,很多人认为,面试的时候问如何造飞机,实际工作如如何拧螺丝。其实我真的很反感这种说法,知道怎么用和什么时候用一定是存在天壤之别的。其实我们日常工作也是在拧螺丝,但是是否螺丝拧的越紧就越好呢,当然此处只是比喻。我们工作更多的时候是curl,不论缓存也好还是数据库也好还是高级一点的分布式,代码质量对于我们来说就尤为重要了,我见过10来秒的sql,在例会的时候这个人就被炒了,他结果没查对吗,肯定是对的,但是让程序走了许多弯路。总而言之,我见过的大神都是基础特别扎实,对各种设计模式和应用场景都是有相当深入的了解,所以我就出了大话篇,在看过很多文章加上自己的总结后进行的一系列的升华,当然,我的文章也不可避免的存在一些问题,欢迎大家指正,毕竟共同进步才是共赢。
工厂模式的介绍和场景
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
改进:此处可以参考thinkphp框架中config文件引入的代码:使用reflecationClass 和reflecationMethod相关函数对类进行实例化,不用判断类的标识。很大程度解决了工厂模式的缺点。
简单工厂模式/静态工厂模式
简单工厂模式又称静态工厂模式
具体实现:接口层,具体实例层,工厂产出层
通过工厂产出层管理实例层,通过接口层作为管理的统一标准
工厂方法
实现:多实例管理,相比简单工厂模式,更加复杂,但是相对而言解决了简单工厂模式的耦合性高,违反工厂模式封闭原则的问题。
工厂方法最大缺点就是实例太多,加一个产品的流程:加产品实例,加管理实例。
推荐:用简单工厂的改进版
抽象工厂:
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
抽象工厂管理多实例,实际上抽象类使用和注册树模式特别像,但是抽象类不需要提供类的标识,只要知道内部方法就可以调用类的方法
网友评论