学习23种JAVA设计模式

先简单记录三个工厂、三中单例整理

1、简单工厂没有抽象工厂类 一个工厂类 有一个抽象产品 多个产品实现类 可通过入参控制工厂返回的产品对象 缺点(扩展性差) 只能造一类产品

2、普通工厂有抽象工厂类 多个工厂类 有一个抽象产品 多个产品实现类 一个工厂实现类返回一个产品 缺点(扩展麻煩) 沒添加一个产品需要新添加一个工厂。。

3、抽象工厂有抽象工厂类 多个工厂类 有多个抽象产品 多个产品实现类 一个工厂实现类返回一类抽象产品

4、懒汉单例:
懒加载,静态实例先不初始化。双重检查锁(double check lock DCL)。用的时候在创建。

    private SingleBoy(){};
    private static  SingleBoy s = null;
    private static getInstance (){
    	if(s==null){
    		synchronized (s) {  
                if (s == null) {  
                    s= new SingleBoy();  
                }  
            }  
    	}
    	return s;
   } 			

创建对象的顺序:
1.在堆内存开辟内存空间。
2.在堆内存中实例化SingleTon里面的各个参数。
3.把变量指向堆内存空间。
JVM重排指令 DCL可能会出现问题,第一次创建对象的时候如果先执行了1、3没执行2,那么第二个线程進來发现 SingleBoy非空,就会返回一个半成品对象的地址。JDK1.6及以后,只要定义为private volatile SingleBoy就能解决DCL失效问题。针对DCL失效问题,A、B两个线程,A正在高速缓冲区创建SingleBoy,B先去主内存中看有没有SingleBoy,这时候A还没有返回SingleBoy给主内存,所以B认定SingleBoy没有创建,就会跑到同步块的代码前,在廁所外面排队。
https://blog.csdn.net/mnb65482/article/details/80458571

5、饿汉单例:
https://blog.csdn.net/nielinqi520/article/details/79132361
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。(小心反射)
加载类的时候直接创建 每次取不用重新new

        private SingleBoy(){};
        private static  SingleBoy s =  new SingleBoy();  
        private static getInstance (){
        	return s;
        } 

6、内部类单例

private SingleBoy(){}
private static class SingleBoyHandler {
    private static SingleBoy singleBoy= new Singleton();
}
public static Singleton getInstance(){
    return SingleBoyHandler.singleBoy;
}

第一次调用的时候才会加载静态内部类,既有饿汉的加载时创建特性,又有懒汉的用时才创建特性。

7、建造者模式(针对大对象的复杂构建过程)
指挥员 指挥建造者建造,
建造者接口 有很多建造的本领(未实现的方法)
建造者实现类 实现了很多建造的方法
产品类
指挥员有很多指挥的方法,针对不同的应用场景返回不同的对象,例如组装电脑,有的型号要先装主板,有的先装硬盘,指挥员重载一下指挥方法就OK。把产品细化成各个部件,这样子就会很灵活,可以满足各种需求。

建造者模式和工厂的区别,工厂如果涉及到变更需求,可能需要变更产品类,重载一个构造器,区别就是构造的过程(先装主板,还是先装硬盘)交给谁实现。

8、原型模式
public class Prototype implements Cloneable {

public Object clone() throws CloneNotSupportedException {  
    Prototype proto = (Prototype) super.clone();  
    return proto;  
}  

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单例模式:某个类只能有一个实例,提供一个全局的访问点。 简单工厂:一个工厂类根据传入的参量决定创建出那一产品类的实例。 工厂方法:定义一个创建对象的接口,让子类决定实例化那个类。 抽象工厂:创建相关或依赖对象的家族,而无需明确指定具体类。 建造者模式:封装一个复杂对象的构建过程,并可以按步骤构造。 原型模式:通过复制现有的实例来创建新的实例。 适配器模式:将一个类的方法接口转换成客户希望的另外一个接口。 组合模式:将对象组合成树形结构以表示“”部分-整体“”的层次结构。 装饰模式:动态的给对象添加新的功能。 代理模式:为其他对象提供一个代理以便控制这个对象的访问。 亨元(蝇量)模式:通过共享技术来有效的支持大量细粒度的对象。 外观模式:对外提供一个统一的方法,来访问子系统中的一群接口。 桥接模式:将抽象部分和它的实现部分分离,使它们都可以独立的变化。 模板模式:定义一个算法结构,而将一些步骤延迟到子类实现。 解释器模式:给定一个语言,定义它的文法的一表示,并定义一个解释器。 策略模式:定义一系列算法,把他们封装起来,并且使它们可以相互替换。 状态模式:允许一个对象在其对象内部状态改变时改变它的行为。 观察者模式:对象间的一对多的依赖关系。 备忘录模式:在不破坏封装的前提下,保持对象的内部状态。 中介者模式:用一个中介对象来封装一系列的对象交互。 命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。 访问者模式:在不改变数据结构的前提下,增加作用于一组对象元素的新功能。 责任链模式:将请求的发送者和接收者解耦,使的多个对象都有处理这个请求的机会。 迭代器模式:一遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值