单例(懒汉、饿汉)。
简单工厂(封装一个工厂类负责创建实例对象,传不同的值创建不同的对象,比如传草莓创建草莓冰淇淋,传核桃创建核桃冰淇淋)。
工厂方法(简单工厂的工厂也分伦敦工厂和东京工厂,也是继承了一个工厂基类)。
抽象工厂(工厂方法中一个工厂只能生产一种产品(如冰淇淋),若现在还想能生产水,工厂类还需要有个createwater的接口)。
生成器模式:有个对象需建立,但是它有多个组件,比如电脑有主机和鼠标,就需要一个builder类,
定义了对象的各个组件的创建方法和返回相应对象的方法,Director类对组件进行组装并生成产品,
里面包含了Builder类和一个大方法(它调用了builder的多个生产组件的方法)。
原型模式:就是复制,分为深浅拷贝,在java中就是重写clone方法。
适配器模式:说白了就是把一个类的接口封装成另外一个类的接口,免得接口不匹配。
装饰者模式:装饰类和被装饰类都继承自一个父类,如饮品和调料都继承自商品,都有获得价格、获得商品信息等属性,牛奶继承可饮品,糖可基础调料,且糖这个类里面有一个成员变量是牛奶。
代理模式:比如我要买房,代理类里面有个房子的成员变量,代理类和这个房子类都实现了一个接口,里面都有买房这个成员函数,代理类对象的买房不但会调用房子类的买房,还会做一些其他的事情,比如交税等杂事。 智能指针就是这种。
外观模式:隐藏内部复杂的细节,如电脑有cpu和内存,电脑开关机时,相应部件也要开关,CPU类有开机和关机的接口,内存也是,电脑也是,但是电脑内部包含了CPU和内存的成员变量,电脑的开机调用了CPU和内存的开机。
桥接模式:比如两个类 手机品牌 和 手机软件 ,让所有软件实现软件类的run方法,手机这个类里面有软件的成员变量,有run方法,然后不同品牌手机的run其实是调用软件这个成员变量的run。分离手机品牌和手机软件,解耦。
组合模式:组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象, 如一个component类(成员函数有add(component),remove(component),getchild(i),遍历等),被树叶类和树枝类(里面有个成员变量是树叶类的集合)都继承。
享元模式:一个工厂有一个map,创建对象时如果有对应的key就返回已有对象,否则新创建个并加入map再返回。将内部状态和外部状态相分离,比如按某个属性获得对象,再对该对象的其他属性进行一些设置。
策略模式:一个策略类有加法的接口,不同策略的类继承它但加法的实现不一样,有个类有一个策略类的成员变量,它的计算接口调用该成员变量的加法接口。
模板模式:一个做菜类,里面有准备、做、装盘三个方法,还有做菜方法(它调用这三个方法),子类继承它,实现具体的三个方法。
观察者模式:被观察者类有三个接口 加入观察者、删除观察者、通知观察者(会调用所有观察者的update方法),有个成员变量是观察者的集合,一个成员变量是string信息,观察者类有一个接口是更新信息update(设置新的string并打印出来)。
迭代器模式:一个类有hasnext和next接口,其他具体迭代器类实现它,具体的迭代器内有其对应的集合,有cursor,而对应的集合类有 add、remove、返回对应迭代器的接口。
责任链模式:一个抽象的决策者类有成员变量决策者,还有成员函数处理请求和设置决策者,具体的决策者是继承这个类。在处理请求函数中根据请求的特点来自己处理还是调用其成员变量(也是个决策者)的处理请求函数。
命令模式:一个命令抽象类有 do 和 undo 两个接口,具体类继承它,同时有一个成员变量light,do调用light.off ,undo调用light.on,请求者这个类有两个接口do和undo,分别调用命令类的do和undo (但是命令类不是它的成员变量,是在调用时传入的)。
状态模式:一个状态类,有do_action接口,一个startstate状态类继承它,do_action(Context context)调用(context.setstate(stopstate))和 to_string接口,一个stopstate状态类也一样context.setstate(startstate),context 这个类里面有个state成员变量和设置、获取state的接口。
备忘录模式:有个备忘录类有成员变量string state,有设置和获取它的接口,有个类有state成员变量,获取和设置它的接口,有savetomemento方法(创建一个备忘录类)和从备忘录类获取state的方法,有个类有个成员变量是备忘录类的集合,有add(memento)方法 和 get(index)方法。
访问者模式:访问者类visitor,有接口visit(element),调用element的getA,getB接口,element类有个接口accept(visitor),会调用传入的visitor的visit(this),有个数据结构类有element集合,有添加、删除、获取element的接口,有accept(visitor)接口,会调用所有element.accept(visitor)。
中介者模式:有一个客户类,有中介者类的成员变量,receive方法和send方法(调用中介者的relay方法)和设置中介者的方法,有个中介者类有注册客户,转发(relay)到客户(根据传入的客户从集合找到它并调用它的receive)的方法,有客户的集合这个成员变量。
23种设计模式
于 2022-03-10 21:37:18 首次发布