java 23种设计模式学习。
一.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{
@Override
public void send(){
System.out.println("this is mailSender!");
}
}
public class SmsSender implements Sender(){
@override
public 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{
@Override
public Sender produce(){
return new SmsSender();
}
}
public class SendMailFactory implements Provider{
@Override
public 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;
}
这样时似乎解决了问题,
java 23种设计模式学习。的更多相关文章
- Java 23种设计模式
转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...
- java 23种设计模式及具体例子 收藏有时间慢慢看
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...
- java 23 种设计模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- (转)java 23种设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java 23种设计模式 深入浅出
以下内容只作为对自己对知识进行总结,如有引用他人文章会在文段末尾表明出处: Java的23种设计模式 23种设计模式总共可以分为三大类,进行不定期更新总结,将逐步展开介绍自己对设计模式的理解,多多指教 ...
- Java 23 种设计模式的分类和功能
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性的解决方案. 设计模式 ...
- java 23种设计模式,一般情况下,常用的有哪些? 转载
原址:http://wangle.iteye.com/blog/196972 工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式 ...
- Java 23种设计模式详尽分析与实例解析之三--行为型模式
Java设计模式 行为型模式 职责链模式 模式动机:职责链可以是一条直线.一个环或者一个树形结构.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理组织成一条链,并使请求链传递,由链上的处理者 ...
- 一、Java 23 种设计模式简介
一.23种设计模式分类: 二.设计模式的六大原则: 1.开闭原则(Open Close Principle):对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效 ...
随机推荐
- 03_java基础(一)之计算机应用知识普及
1.计算机(Computer) 全称:电子计算机,俗称电脑.是一种能够按照程序运行,自动.高速处理海量数据的现代化智能电子设备.由硬件和软件所组成,没有安装任何软件的计算机称为裸机.常见的形式有台式计 ...
- SSL、TLS中间人攻击
生成私钥 生成一个ca.key私钥签名 然后用私钥生成一个伪造证书服务器的根证书 生成一个伪造证书服务器的根证书ca.crt 在攻击主机启动路由转发功能 或者echo 1 > /proc/sys ...
- 虚拟机VM下CentOS7部署WASND9+HTTP9
本地操作系统:WIN10(64位) 虚拟机:14.1.1 build-7528167 安装环境:CentOS7 64 软件版本:IM 1.8 WAS 9.0+HTTP9.0 一.安装CentOS7 ...
- Shell教程 之流程控制
1. if else 1.1 if if语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): if ...
- 字符串 String 格式化 format
String str=String.format("Hi,%s", "王力"); 保留两位数的整数: String str=String.format(&quo ...
- 什么是QPS,PV
术语说明: QPS = req/sec = 请求数/秒 [QPS计算PV和机器的方式] QPS统计方式 [一般使用 http_load 进行统计] QPS = 总请求数 / ( 进程总数 * 请求时间 ...
- TZOJ 1321 Girls and Boys(匈牙利最大独立集)
描述 the second year of the university somebody started a study on the romantic relations between the ...
- zookeeper 单机版配置
zookeeper :中间件,为分布式系统进行协调服务 作用于分布式系统,可以为大数据服务 支持java 和 C 客户端的api zookeeper 特性:一致性,数据会按照顺序分批入库: 原子性:数 ...
- IQKeyboardManager
enable控制整个功能是否启用. shouldResignOnTouchOutside控制点击背景是否收起键盘. shouldToolbarUsesTextFieldTintColor 控制键盘上的 ...
- 41-ssm中对象查找正确但是没有将数据库中某个属性值赋给对象的一个成员变量
原因: 变量名虽然与 数据库字段一致,但是 包含下划线,如: a_b,数据库确实也是a_b: 但是ssm开启驼峰命名了,就要将变量名改为 aB , 驼峰命名就可以了.