<commit_before>---
layout: post
title:  "《大话设计模式》-读书笔记"
date:    2016-01-26 19:20
categories: Life
---
## 背景
横穿2015年，感觉自己做了一堆傻事。随着研究生学习的深入，看到了身边各路大神，不老老实实学点东西，以后拿什么来装逼！
一股压迫感油然而生。针对自己毫无面向对象编程思想的现状，大约花了4天时间，读了这本书，受益颇深，在此记录下一些东西，
方便以后装逼。

## 总述
《大话设计模式》一书讲了一个“小菜”从面试受挫，一步步走向人生巅峰的故事，从对爱情、人生、理想等常见问题讨论开始，
引出面向对象程序设计的思想，是大型软件系统开发的必读书籍。

本书从面向对象基本特称：抽象性、封装性、继承性、多态性出发，重点讲述了面向对象编程的6大原则，即：
单一职责原则、开放-封闭原则、依赖倒转原则、里氏代换原则、迪米特法则、合成/聚合复用原则。
以及针对6条基本原则而产生的23种设计模式（简单工厂模式不符合开放-封闭原则，不计算在内）。

## 6大原则

单一职责原则：
一个类应该仅包含引起它变化的原因，软件设计的许多内容就是发现职责并把职责相互分离，
从而降低功能之间的耦合度，实现低耦合。

开放-封闭原则：
对扩展开放，对更改封闭。能够提高程序的可维护性、可扩展性、可复用性、灵活性。

依赖倒转原则：
抽象不应该依赖细节，细节应该依赖抽象。（针对接口的编程，不要针对实现编程）

里氏代换原则：
子类必须能够替换掉他们的父类。即子类继承父类后，并可以替换掉父类，且软件单位的功能不受影响。

迪米特法则：
如果两个类不必彼此通信，这两个类就不应该直接相互作用，如果一个类调用另一个类方法，
可以通过第三者转发这个调用。核心思想是强调类之间的松耦合。有利于类的复用。

合成/聚合复用原则：
尽量使用合成/聚合，尽量不要使用类继承。（合成：强‘拥有’关系，严格的整体和部分关系，两者有相同的生命周期。
聚合：弱‘拥有关系’，A可以包含B，但B不是A的一部分）

## 23种设计模式

### 5种创建型模式+简单工厂模式
简单工厂模式：

工厂方法模式：

抽象工厂模式：

建造者模式：

原型模式：

单例模式：

### 7种结构型模式<commit_msg>修改大话设计模式<commit_after>---
layout: post
title:  "《大话设计模式》-读书笔记"
date:    2016-01-26 19:20
categories: Life
---
## 背景
横穿2015年，感觉自己做了一堆傻事。随着研究生学习的深入，看到了身边各路大神，不老老实实学点东西，以后拿什么来装逼！
一股压迫感油然而生。针对自己毫无面向对象编程思想的现状，大约花了4天时间，读了这本书，受益颇深，在此记录下一些东西，
方便以后装逼。

## 总述
《大话设计模式》一书讲了一个“小菜”从面试受挫，一步步走向人生巅峰的故事，从对爱情、人生、理想等常见问题讨论开始，
引出面向对象程序设计的思想，是大型软件系统开发的必读书籍。

本书从面向对象基本特称：抽象性、封装性、继承性、多态性出发，重点讲述了面向对象编程的6大原则，即：
单一职责原则、开放-封闭原则、依赖倒转原则、里氏代换原则、迪米特法则、合成/聚合复用原则。
以及针对6条基本原则而产生的23种设计模式（简单工厂模式不符合开放-封闭原则，不计算在内）。

## 6大原则

单一职责原则：
一个类应该仅包含引起它变化的原因，软件设计的许多内容就是发现职责并把职责相互分离，
从而降低功能之间的耦合度，实现低耦合。

开放-封闭原则：
对扩展开放，对更改封闭。能够提高程序的可维护性、可扩展性、可复用性、灵活性。

依赖倒转原则：
抽象不应该依赖细节，细节应该依赖抽象。（针对接口的编程，不要针对实现编程）

里氏代换原则：
子类必须能够替换掉他们的父类。即子类继承父类后，并可以替换掉父类，且软件单位的功能不受影响。

迪米特法则：
如果两个类不必彼此通信，这两个类就不应该直接相互作用，如果一个类调用另一个类方法，
可以通过第三者转发这个调用。核心思想是强调类之间的松耦合。有利于类的复用。

合成/聚合复用原则：
尽量使用合成/聚合，尽量不要使用类继承。（合成：强‘拥有’关系，严格的整体和部分关系，两者有相同的生命周期。
聚合：弱‘拥有关系’，A可以包含B，但B不是A的一部分）

## 23种设计模式

### 5种创建型模式+简单工厂模式
简单工厂模式：（计算器故事）使用一个单独的类，来做创建实例的过程，这个类就是工厂。简单工厂类封装客户端逻辑。
当添加新的实例类型时，需要修改工厂的分支语句。违反了开放-封闭原则！

工厂方法模式：（雷锋故事）定义一个用于创建对象的接口，让子类决定实例化哪个类，工厂方法将实例化延迟到子类。
（从简单工厂模式的一对多，变成多对多，符合开放封闭原则，但是类选择逻辑放到了客户端，增加了客户端对具体类的依赖）

抽象工厂模式：（多数据库故事）提供一个创建一系列相关或相互依赖对象的接口，而无需制定它们具体的类。
实现1：工厂方法模式+多方法；实现2：简单工厂模式+多方法+反射。 （好处1：只需修改一次工厂，即可完成不同产品的配置；
好处2：具体类名，实例的创建与客户端分离，不会出现在客户端代码中）

建造者模式：（画小人故事）将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。
主要角色有：产品基类，产品类1···产品类n,指挥官，客户端。其中指挥官负责构建算法，产品类负责表示。

原型模式：（做简历故事）用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新对象。
原型模式是从一个对象创建另外一个可定制对象，不需要知道创建的细节。（注意C#和JAVA直接赋值为引用赋值，浅复制）

单例模式：（MDI窗体故事）保证一个类仅有一个实例，并提供一个访问他的全局访问点。
懒汉模式：在类内采用静态变量的方式保存创建状态，注意多线程访问时，公共变量要加锁访问。
饿汉模式：使用静态变量初始化方法。自动解决多线程不安全问题。

### 7种结构型模式
{'fraction_non_alphanumeric': 0.13218390804597702, 'fraction_numerical': 0.021839080459770115, 'mean_word_length': 13.113513513513514, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4150629', 'n_tokens_mistral': 2557, 'n_tokens_neox': 3098, 'n_words': 98}