前言:尽管市面上有各种各样的设计模式的书籍和教程,比如C#设计模式、java设计模式、python设计模式、js设计模式,但其实大家的思想都是一样的,就像武林高手比拼的,永远是内功,因为已经过了那个还在关注招式的层面。
我在看那些教程的时候注意到了一个有意思的现象。大家都说的是GOF的那23种经典设计模式,但是说到具体是哪23种,就会产生一点小小的分歧,比如简单工厂模式,有些人认为它属于GOF23种的一种,有些人认为不属于。但不可否认的是,简单工厂绝对是一种设计模式。设计模式可以有成百上千种,但经典的就是GOF的那23种。其实我们大可不必纠结它到底属不属于23种里的一种,只要能解决我们的问题就行。
设计模式有三种类型,我们用123来表示一下:
1 创建型
2 结构型
3 行为型
以下是我对设计模式的一些思考:
1.1、单例模式
单例模式就是只允许产生一个对象,不管是多少个线程访问这个资源,都是访问这一个对象。C#和java在单例模式在双重判断的写法上稍微有些不同。C#的锁是用的lock关键字,java用的是synchronized关键字。但是有一点需要注意的是,java的单例模式,偶尔会遇到因为指令重排导致的单例模式失败的情况,但是C#从来没遇到过。对于这种现象可以用volatile禁用指令重排,或者采用饿汉式的单例模式。即程序一进来就产生静态对象,比较着急,所以叫饿汉式。这种方式不会没有线程安全问题,无论是C#还是java。
1.2、简单工厂
将创建产品的过程都封装到了一个工厂类中,如果创建的产品需要变化,就得更改这个工厂类,因为设计的比较简单,所以叫简单工厂,哈哈。其实当你明白什么是简单工厂以后,你就会惊讶这就是简单工厂?这不是我们天天都在用的么?是的,简单工厂使用的很频繁,只不过你不知道那是简单工厂而已。
1.3、工厂方法
工厂方法是将所有工厂抽象出来一个父类,所有产品也抽象出来一个父类,在工厂的子类中返回new出来的产品子类,将产品和工厂进行了解耦。后面如果是实现新的产品,只需要有新的工厂和新的产品分别继承他们的父类就完事了。这个设计模式的可拓展性非常好,非常符合设计模式中的“对拓展开放、对修改封闭”原则,即开闭原则。
1.4、抽象工厂
持续更新中。。。。。