Giter Site home page Giter Site logo

design-pattern's Introduction

设计模式花园(Design Garden)

设计模式花园,通过最常用的实例帮助您快速学习和实践简单但功能强大的23种设计模式。

创建型模式

创建型模式是关于对象实例化的模式。

模式 ** 场景 优缺点
1. 单例模式 一个类只有一个实例,并在类中提供一个访问它的全局访问点。解决了资源访问冲突问题、单例对象节约内存提高性能,适合频繁创建和销毁且创建时耗费很多资源的对象。 网站计数器、读取配置文件或数据库、工具类等。 -
2. 工厂模式 创建一个接口和一系列实现该接口的实体类,然后创建一个工厂类,由传入字符串类型判断实例化哪一个实体类。 1)日志记录器。选择哪种存储方式:硬盘、远程服务器等。2)数据库访问,选择哪类数据库进行链接。3)设计一个连接服务器的框架,选择哪种协议进行连接。 -
2. 抽象工厂模式 创建一个抽象工厂类和工厂生产类,根据传入字符串类型判断使用哪种工厂对象,然后工厂类传入字符串类型判断创建哪个类。 - -
8. 构建器模式 构建器模式是使用多个简单对象链式构造一个复杂对象,一般在类中增加一个builder静态类,类中实现各种设置属性的方法。常用于链式形式初始化一个参数很多的对象。 - -
14. 原型模式 原型模式又叫克隆模式,从当前对象克隆一个相同对象。 Java内部自带原型模式,Object.clone()。 -
结构型模式

结构型模式是关于类和对象组合的模式。

模式 ** 场景 优缺点
5. 外观模式 为子系统(子类)提供一个统一的界面(初始化子类,并提供子类方法)。(类似工厂模式,一个提供一个子类对象,一个提供多个子类对象方法) - -
6. 组合模式 创建一个包含自己对象组的类,构建一个树形的层次结构。 - -
7. 享元模式 提前创建好对象放入池子中,重复利用。 数据库连接池、JAVA中的string,如果有则返回,没有则创建一个字符串放入字符串缓存池中。 -
10. 适配器模式 适配器模式(包装器模式)是将类的接口转化为另一个类的接口。包括:类适配器模式和对象适配器模式。 类适配器是适配器继承类。对象适配器是适配器类构造方法传入原类对象,然后实现目标接口的方法对父类进行改写。 我们构造一个人猫适配器,实现人类与喵星人的对话。 -
12. 装饰器模式 装饰器模式是在不改变原类的情况下,添加新的功能(装饰)。具体做法是创建一个抽象类(装饰类)并传入原有的类,然后重写原有类方法。 1)扩展一个类的功能。2)替代继承。 -
18. 代理模式 代理模式是一个类代表另一个类的功能(继承也可以实现类似的功能,这里通过耦合来代替继承,实现解耦的目的)。 买茅台并不一定要去茅台厂买,可以去各种经销店购买。 -
19. 桥接模式 桥接模式将抽象部分(抽象类)和实现部分(类)分离,二者都可以独立的变化。具体做法是顶层两个抽象类,其中一个抽象类中聚合(构造函数传递)另一个抽象类的实现类,然后创建包含两种概念的对象。 - -
行为型模式

行为型模式是关于多个类或对象通过协作共同完成一个任务的模式。行为模式包括对象行为模式或类行为模式。

模式 ** 场景 优缺点
4. 策略模式 定义多个策略类,策略继承同一个策略接口,Context类方法可以根据传入的策略对象,调用不同的策略对象方法(Context初始化时,传入策略对象,然后调用策略对象方法)。 - -
9. 模版模式(钩子函数、回调函数) 模板模式是提供一个可作为模板的抽象类,具体做法是定义一个包含多个抽象方法和一个方法(作为模板方法)的抽象类,子类按需要实现抽象方法来完成模板方法。类似做菜的步骤,先定一个好一个模板,卖菜、洗菜、煮饭,然后通过子类中对这些步骤进行填充,来达到按需实现做菜整体过程的目的。 - -
11. 命令模式(Action模式、事务) 命令模式是使类继承具备撤销功能的抽象类,从而具有撤销功能。 - -
13. 备忘录模式 保存一个对象当前状态,以便在适当的时候进行恢复。 游戏中的存档和读档。 -
15. 状态模式 状态模式中基于状态决定类的行为。具体做法是我们实现一个状态抽象类/接口,继承或实现的子类分别对应不同的状态,且子类中重写不同的方法。 - -
16. 观察者模式 观察者模式又叫事件处理模式,一个对象的状态发生更改时,会通知所有依赖它的对象并自动更新。PS:钩子函数Hook、Callback、Listener、Observer本质上都是观察者模式。 - -
17. 责任链模式 责任链模式是处理请求的模式,将多个处理器串成一条链,让请求在链上进行传递。 报销审批,在自己职责范围中的可以审批,然后扔给下一个审批者。 -
20. 迭代器模式 迭代器模式是顺序访问对象的各个元素,而又不用暴露对象的内部表示。 - -
思考题
  1. 状态模式和策略模式的异同点?
  2. 代理模式和装饰器模式的异同点?
  3. 动态代理模式如何实现?
  4. 设计模式中何时用抽象类,何时用接口,二者可以替代使用吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.