栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式学习

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式学习

目录

前言

一、设计模式七大规则?

二、常用设计模式理解

1.单例模式

懒汉式

饿汉式

2.工厂模式

总结


前言

这是我的设计模式笔记


以下是本篇文章正文内容,下面案例可供参考

一、设计模式七大规则?
    开闭原则:对扩展开放,对修改关闭单一职责原则:一个类只负责一个功能相应区域里氏代换原则:一个父类可以透明使用子类的所有方法(子类可以去扩展父类的方法,但是不要去修改父类的方法)依赖倒转:依赖抽象不能依赖具体实现(通俗解释就是面向接口编程,把不同的模块抽象成接口,使两个模块能同时进行开发)接口隔离:类之间的关系应该建立在最小的接口(在写接口时如果写的非常多,那么你实现一个接口就要实现大量方法,所以一定要最小接口,方法够用就行)合成聚合复用:尽量使用合成聚合复用而不是继承复用迪米特法则:一个软件的实体类应该尽可能的与其他实体少接触(降低耦合性)

二、常用设计模式理解

1.单例模式

单例模式讲究的就是只能new一个出来,但是这种看起来很简单的只能new一个,里面却复杂的一批,涉及多线程,jvm虚拟机等等

懒汉式
public class sing {
    private static sing sing;
    private sing(){}
    public static sing getSing(){
        if(sing != null){
            return sing;
        } else {
                  sing = new sing();
                    System.out.println("new了的单例:"+sing);
                }

            }
        }
        return sing;
    }

    public static void main(String[] args) {
        sing sing1 = sing.getSing();
        sing sing2 = sing.getSing();
        System.out.println(sing1);
        System.out.println(sing2);
    }
}

这个单例在单线程情况下的确是正常的,可是java本来就是拿来做后端的,一旦引入多线程:

new Thread(() -> {
            System.out.println("线程1得到的单例:"+sing.getSing());
        }).start();
        new Thread(() -> {
            System.out.println("线程2得到的单例:"+sing.getSing());
        }).start();

 这时候你感觉也没问题,但是它已经出问题了。由于我们处理的数据量少,所以第一个线程一下就执行完毕,当第二个线程再进来是判断到的确有了单例就不会继续创建,所以得到的结果是正确的。但是如果处理的数据量大呢?

else {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            sing = new sing();
            System.out.println("new了的单例:"+sing);
            }

这里模拟sleep一秒,表述正在处理数据,看看结果:

 

结果就是由于两个线程由于上一个线程还在处理东西,没及时new出来,第二个线程就进来了。第二个线程判断null于是也new了一个,单例单例肯定是只能new一个出来,这里new了两个肯定是有问题,解决问题也很简单,直接把他变成同步方法+个synchronized关键字:

public synchronized static sing getSing(){

好家伙正常了,但是问题来了,要是每个人每个方法都要过来拿锁,那不是人人都要等着,你已经new了也要等?显然不合理,那么就让new一次的有锁就行了,new完了,这把锁就放掉:

    public static sing getSing(){
        if(sing != null){
            return sing;
        }else {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (sing.class){
                if(sing == null){
                    sing = new sing();
                    System.out.println("new了的单例:"+sing);
                }
            }
            }
        return sing;
    }

 最后为了防止jvm的重排列,我们再在sing前加一个volatile万无一失

private volatile static sing sing;

饿汉式

饿汉式比较简单,是线程安全的,但是就是无论如何都会new一个对象,消耗性能。

public class Person {
    //饿汉式单例
    private static Person person = new Person();
    private Person(){}

    public static Person getInstance(){
    return person;
    }
}
2.工厂模式 简单工厂:

是一种暴露生产逻辑的生成方式,比较简单:

 

public class SimpleFactory {
    TvFactory tf = new TvFactory();
    TV xiaomi = tf.getTv("xiaomi",27);
    TV haier = tf.getTv("haier",30);
}

interface TV{
    public void showTv();
}

class xiaomiTV implements TV{
    protected String name;
    protected int size;
    public xiaomiTV(String name,int size){
        this.name = name;
        this.size = size;
    }

    @Override
    public void showTv() {
        System.out.println(name+","+size);
    }
}

class haierTV implements TV{

    protected String name;
    protected int size;
    public haierTV(String name,int size){
        this.name = name;
        this.size = size;
    }
    @Override
    public void showTv() {
        System.out.println(name+","+size);
    }
}

class TvFactory{
    public static TV getTv(String name,int size){
        TV tv = null;
        if("xiaomi".equals(name)){
            tv = new xiaomiTV("xiaomi",size);
        }else if("haier".equals(name)){
            tv = new haierTV("haier",size);
        }
        return tv;
    }
}

工厂方法:

把暴露生产逻辑的交给子类处理:

 


总结

以后会刻意去按照设计模式去编写代码

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750818.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号