12种设计模式的快速参考收藏
新一篇: 调查在CSDN混的IT朋友是否科班出身的结果 | 旧一篇: 大家看看此文和我有啥关系?国产数据库厂商紧密联手 打造基础软件自主品牌
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>设计模式开篇——一些原则
设计模式快速参考-简单工厂模式
设计模式快速参考-工厂方法模式
设计模式快速参考-工厂方法模式
设计模式快速参考-单例模式
设计模式快速参考-适配器模式
设计模式快速参考-组合模式
设计模式快速参考-外观模式
设计模式快速参考-代理模式
设计模式快速参考-命令模式
设计模式快速参考-观察者模式
设计模式快速参考-策略模式
设计模式快速参考-参观者模式
附上原则篇
设计软件的几个原则,这个也是设计模式的精髓所在:
1.开-闭原则
1).客户的需求是不稳定的,通过扩展已有的软件系统而不是通过修改软件系统来满足客户的需求,这样的软件系统就满足开-闭原则,即软件系统要有一定的灵活性和适应性。
2).已有的模块,特别是抽象层的模块不能修改,保证软件系统的稳定性和延续性。
解决问题的关键是抽象化,把它与具体实现分离开来。接口(interface),抽象类的应用
对可变性封装:将可变性封装到一个对象里。
2.抽象类
抽象类不会有实例,一般作为父类为子类继承,一般包含这个系的共同属性和方法。
注意:好的继承关系中,只有叶节点是具体类,其他节点应该都是抽象类,也就是说具体类
是不被继承的。将尽可能多的共同代码放到抽象类中。
3.里氏代换原则
在有基类出现的地方,子类均可以替代。
当两个具体类关系违反里氏代换原则时,一种办法是抽象出一个基类,作为这两个类的父类,
一种是应用组合聚合关系建立关系。
不要为了使用某些类的方法(功能)而滥用继承。
4 依赖倒转原则
抽象不应该依赖与细节,细节应当依赖与抽象。
要针对接口编程,而不是针对实现编程。
传递参数,或者在组合聚合关系中,尽量引用层次高的类。
主要是在构造对象时可以动态的创建各种具体对象,当然如果一些具体类比较稳定,就不必在弄一个抽象类做它的父类,这样有画舌添足的感觉
5 接口隔离原则
定制服务的例子,每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干
6 合成/聚合原则
尽量使用合成聚合原则,少用慎用继承。
合成:一荣俱荣,一损俱损,整体和部分的生命周期是一样的
聚合:部分可以是整体的一部分,也可以脱离整体而存在。
区分Has a和Is a的问题
7 迪米特法则
最少知识原则。不要和陌生人说话。
设计模式快速参考-简单工厂模式
- abstract class Fruit{
- }
- class Apple extends Fruit{
- }
- class Orange extends Fruit{
- }
- class FruitFactory{
- pulic static Fruit getFruit(String fruitType){
- if (“apple” == fruitType){
- return new Apple();
- } else if (“orange” == fruitType) {
- return new Orange();
- }
- }
- }
设计模式快速参考-工厂方法模式
- interface IFruitFactory{
- puhlic Fruit getFruit();
- }
- class AppleFactory implements IFruitFactory{
- public Fruit getFruit(){
- //生产苹果
- return new Apple();
- }
- }
interface IFruitFactory{ puhlic Fruit getFruit(); } class AppleFactory implements IFruitFactory{ public Fruit getFruit(){ //生产苹果 return new Apple(); } }
Client:
- IFruitFactory factory = new AppleFactory();
- Fruit fruit = new factory.getFruit();
设计模式快速参考-单例模式
- class Singleton{
- private static Singleton singleton = null;
- public static Singleton getInstance(){
- if(null == singleton){
- singleton = new Singleton();
- }
- return singleton;
- }
- public String otherOperation(){
- //方法实现
- }
- }
class Singleton{ private static Singleton singleton = null; public static Singleton getInstance(){ if(null == singleton){ singleton = new Singleton(); } return singleton; } public String otherOperation(){ //方法实现 } }
Client:
- String str = Singleton.getInstance().otherOperation();
String str = Singleton.getInstance().otherOperation();
多线程时使用 double-check 模式确保线程安全:
- class Singleton{
- private static Singleton singleton = null;
- public static Singleton getInstance(){
- if(null == singleton)
- sychronized (Singleton.class){
- if(null == singleton){
- singleton = new Singleton();
- }
- }
- }
- return singleton;
- }
- }