一.3大类设计模式:创建型,结构型,行为型。

a.5种创建型模式:工厂方法,抽象工厂,单例,建造者,原型。

b.7种结构型模式:适配器,装饰器,代理,外观,桥接,组合,享元。

c.11种行为型模式:策略,模板方法,观察者,迭代子,责任链,命令,备忘录,

状态,访问者,中介者,解释器。

注意:除上述3大类外,还有另2类设计模式:并发型,线程池。

二.设计模式6大原则:开闭,里氏代换,依赖倒转,接口隔离,迪米特(最少知道),合成复用。

a.开闭:对拓展开发,对修改关闭。程序进行拓展时,不能修改原有的代码,我们需要使用接口和抽象类。

b.里氏代换(LSP):面向对象设计的基本原则之一,对开闭原则的补充。任何基类可以出现的地方,子类一定出现。子类继承基类,不影响基类的前提下,增加新的方法与功能,基类代码就得以被复用。

c.依赖倒转:开闭原则的基础,针对接口编程,依赖于抽象不依赖于具体。

d.接口隔离:使用多个隔离接口比使用单个接口好。

e.迪米特(最少知道):一个实体应该尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

f:合成复用原则:尽量使用合成/聚合的方式,而不是继承。

三.23种设计模式。

1.3种工厂方法模式:普通工厂,多个工厂方法。

a.普通工厂:建立一个工厂类,对实现同一接口的类进行实例创建的过程。

父接口:

public interface Sender{public void send();
}

实现类:

public class MailSender implements Sender{@Overridepublic void send(){System.out.println("this is mailSender!");}}

public class SmsSender implements Sender(){@overridepublic void send(){System.out.println("this is sms sender");
}
}

工厂类:

public classs SendFactory{public Sender produce(String type){if("mail".equals(type)){return new MailSender();}else if("sms".equals(type)){return new SmsSender();      }else{System.out.println("please input  the correct type!");return null;        }}

    public static void main(String[] args){         SendFactory factory=new SendFactory();         Sender sender = factory.produce("sms");         sender.Send();    }}

输出:this is sms Sender!

b.多个工厂方法:对普通工厂进行了改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确的创建对象,而多个工厂方法 提供多个工厂方法创建对象。

只需改动下工厂类:

public class SendFactory{public Sender produceMail(){return new MailSender();      }public Sender produceSms(){return new SmsSender();  }public void static main(String[] args){Sender mailSender =new SendFactory().produceMail();}
}

c.静态工厂方法:将上面工厂方法模式里的方法写为静态方法,可通过类名+.直接调用。
    工厂方法模式小结:结合a,b,c三种工厂方法模式,第c种发挥了前两种的优势,摒弃了劣势,最适合大多数情况下使用。

2.抽象工厂模式:工厂方法模式有一个缺陷,如果想拓展程序,必须对工厂类进行修改,这违背了开闭原则。如何解决?用抽象工厂模式,创建多个工厂类,一旦需要加新功能,直接增加新的工厂类,就不需要修改之前写好的工厂类代码了。

抽象工厂接口:

public interface Provider{public Sender produce();
}

原有的工厂类修改为两个工厂类:

public class SendSmsFactory implements Provider{@Overridepublic Sender produce(){return new SmsSender();}
}

public class SendMailFactory implements Provider{@Overridepublic Sender produce(){return new MailSender();}
}

相应测试程序:

public class Test{public void static main(String[] args){Provider provider=new SendMailFactory();Sender mailSender=provider.produce();mailSender.send();}
}

3.单例模式:单例对象能保证在一jvm,只有一个实例存在。好处:某些类创建比较繁琐,对于一些大型的对象,可以节省开销;省去了new操作符,降低了系统内存的使用频率,减轻GC压力;某些核心类,如果可以创建多个,系统就完全乱了。

单例类:

public class Singleton{//私有静态实例,防止被引用,此处赋值为空,为了实现延迟加载。private static Singleton instance=null;//私有构造函数,防止外部直接new 实例化.
   private Singleton(){}//静态工厂方法,创建实例
   public static Singleton getInstance(){if(instance==null){instance=new Singleton();}return instance;}   //如果该对象被用于序列化,可以保证对象在序列化前后保持一致   public Object readResolve(){   return instance;  }
}

http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html

尽管这样,还是无法保证安全,在多线程环境下肯定会出问题的。我们首先会想到对getInstance方法加synchronized关键字:

public static synchronized Singleton getInstance(){if(instance==null){instance=new Singleton();}return instance;
}

这样时似乎解决了问题,

转载于:https://www.cnblogs.com/kuiyeit/p/4845898.html

java 23种设计模式学习。相关推荐

  1. 深入浅出Java 23种设计模式,最全PDF版本终于开放下载了!!(文末有福利)

    写在前面 在「 冰河技术 」微信公众号中[设计模式专题]更新完毕已有一段时间了.不少小伙伴在我微信上留言说:冰河,你能不能把[设计模式专题]的文章汇总成PDF文档呢?一直没有时间整理,最近在公众号后台 ...

  2. 设计模式——23种设计模式学习总结

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. 系列文章目录 简单工厂模式 策略模式模式 装饰模式(进行中) 代理模式(进行中) 工厂方法模式 ...

  3. java 23种设计模式 04 单例模式

    java 23种设计模式 04 单例模式 一.什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象.也就是说,在整个程序空间中,该类只存在一个实例对象.   ...

  4. 【设计模式】Java 23种设计模式对比总结

    一.设计模式的分类 创建型模式,共五种(1-5):工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种(6-12):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  5. java 23种设计模式及具体例子 收藏有时间慢慢看

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...

  6. java 23种设计模式(转载)

    设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  7. java 23种设计模式详解

    1. 软件设计模式意义 文章链接:http://c.biancheng.net/design_pattern/     设计模式的本质是对面向对象设计原则运用,是对类的封装.继承和多态以及类的关联关系 ...

  8. 23种设计模式学习记录之代理模式

    想说的话: 在大学的时候曾经学过这23种设计模式,但是那时没啥编程经验,糊里糊涂过了一遍,没多久就忘记了,工作之后将精力主要集中在学习新技术上,比如springboot,cloud,docker,vu ...

  9. Java 23 种设计模式精讲

    软件设计的原则 1. 开闭原则 定义:软件实体应当对扩展开放,对修改关闭. 2. 里氏替换原则 定义:继承必须保证超类所拥有的性质在子类中仍然成立.即子类在继承父类时,除了添加新的方法来新增功能外,尽 ...

最新文章

  1. Facebook万字长文:AI模型全部迁移至PyTorch框架
  2. 〔译〕TypeScript 2.0 候选版发布
  3. 循环类里面的每一个属性
  4. Git得基本使用方法add、commit、push、checkout以及Pull
  5. plotloss记录
  6. TypeScript基本数据类型
  7. 【aviator】aviator 报错 EOF while reading string at index
  8. 蓝牙怎么区分单模和双模_小院闲聊#01#——蓝牙的发展和不同蓝牙之间的关系...
  9. 5天学python_人生苦短,我将学习Python基本句子(第5天),我学,基础,篇,语句,Day5...
  10. Qt应用开发视频教程
  11. Android UI开发:AlertDialog对话框
  12. 刘晓艳老师的考研单词记忆
  13. 光纤测试之常见光纤端面问题
  14. WireShark基本使用(7)第 7 章 高级
  15. Day04_Manuals for Python@lisongye - list列表
  16. 1031. 高一学堂 (at)
  17. 中国被黑站点统计系统 2006年9月分析报告
  18. 计算机主机配置一般有机箱主板cpu,组装台式电脑配置清单
  19. 解决git push报错问题
  20. HTML 中几种常见长度单位介绍

热门文章

  1. typedef和define的作用域
  2. sqlite的交叉编译及移植 -转
  3. 【计算机组成原理】定点乘法运算之原码两位乘法
  4. L1-031. 到底是不是太胖了-PAT团体程序设计天梯赛GPLT
  5. composer 更新php位置,使用composer安装/更新PHP包
  6. JAVA中运行看不见窗口_eclipse中已经把窗口设置为可视,为什么运行 时还是看不到窗口?...
  7. Java中的深拷贝(深复制)和浅拷贝(浅复制)
  8. tomcat java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListen
  9. 数组的filter()方法
  10. Mongdb中常用的数据清洗