设计模式

代码可见:https://gitee.com/wen-haozhe/design-model

 

创建型

单例模式

1.构造方法私有

2.在这个类中只创建一个静态变量

作用:保证全局只有这一个变量,只有此类可以提供全局的一个访问接口

使用场景:全局唯一序列号,IO和数据库连接不想轻易的被销毁

饿汉式

变量在定义时直接被创建

点击查看代码
package Test;

public class Hungry {

    private Hungry(){
        System.out.println(Thread.currentThread().getName());
    }

    private static Hungry hungry = new Hungry();

    public static Hungry getInstance(){
        return hungry;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                Hungry.getInstance();
            }).start();
        }
    }
}

缺点:耗内存,有时没用到这个对象

懒汉式

对象在被调用方法时被创建,需要加锁

点击查看代码
package Test;

public class LazyMan {

    private LazyMan(){
        System.out.println(Thread.currentThread().getName());
    }

    private static LazyMan lazyMan;

    public static LazyMan getInstance(){
        synchronized (LazyMan.class){
            if(lazyMan == null){
                lazyMan = new LazyMan();
            }
        }

        return lazyMan;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                LazyMan.getInstance();
            }).start();
        }
    }
}

工厂模式

作用:当用户想要某个类的实例的时候,他不需要关心这个类的具体的创建的细节,只需要传递相关的参数,在工厂中通过这些参数获取类对象,对用户屏蔽创建的细节,方便操作

使用场景:用户通过车的名字去拿车,而不需要管车是怎么造的

静态工厂模式(简单工厂模式)

工厂类帮你创建对象,你只用向工厂类中传参数

例如用户去买车,用户不需要知道车的构造函数,让工厂去通过参数构造车,屏蔽底层细节实现

工厂方法模式

静态工厂模式不符合开闭原则(扩展开放,修改关闭),因为你添加新车需要修改Factory类的代码

工厂方法模式继承工厂接口,新车实现工厂接口,用户调不同的工厂接口(对于用户更麻烦,因为针对不同工厂)

简单工厂模式比较简单,虽然设计原则上倾向工厂方法模式,但很多时候还是用简单工厂模式

抽象工厂模式

工厂的工厂,可以添加某个产品簇。工厂的里面也是抽象的工厂接口。

作用:解决一个产品簇中有多个产品,而用户只消费其中一个产品。

例如:我一个产品簇中有手机,路由器,抽象工厂先定义获取这两个东西的抽象方法,然后再用具体的工厂实现这两个抽象方法

抽象工厂:获得手机,获得路由器

产品接口:手机,路由器

小米实现两个产品接口,然后在抽象工厂中返回这两个自己的工厂产品

华为同理

建造者模式

作用:你一个对象可能有多种构建方法,例如一种套餐,有多种不同的组合

将构建与表示分离

首先创建抽象的构建者,ConcreteBuilder是构建者的具体实现,这里面会获得产品。Director中通过获取不同的Builder获取不同的表示。

原型模式

继承cloneable方法,实现其中的clone方法后完成对象的复制

使用场景:一个系统独立于他产品的创建,构成和表示

 

结构型模式:

适配器模式

在扩展一个类的接口(使你的一个接口可以匹配更多的类)

例如我有个mp3播放器:play(String judge),此时judge只能匹配“mp3”,我如果想要匹配“mp4”,我可以在这个类中添加mp4的类,然后在play函数中去添加mp4的判断,调用mp4的play方法

代理模式

将控制和业务分离,可以通过代理类去给被代理类添加控制

装饰器模式

在不改动原有类代码的基础上添加新功能,通过实现装饰类,将原有类的对象传进去,再调用其方法

组合模式

想要创建树形结构或者目录型结构使用,通过在类中添加列表的方式,当对象间有上下级的关系就记录在列表中

外观模式/门面模式

将多个服务的多个接口用一个门面包装起来,这样别人只用调用这个门面类就可以了

 

行为型:

策略模式

通过一种接口的不同实现,来选择不同的调用策略

访问者模式

一个类中的变量太多,提供一个访问者类,通过访问者类的限制去访问类中特定的元素

观察者模式

对于一个类有多个观察者,当类中的信息发生改变的时候,观察者会察觉到改变并做出变化

模板模式

定义一个模板,一些子类去继承这个模板,然后创建模板类去调用具体方法

迭代器模式

创建一种可以遍历集合中元素的方法,而不用暴露元素的具体信息

中介模式

消息队列,处理不同对象之间的通信,使对象与对象之间低耦合

责任链模式

一些类共同继承某个父类,然后通过链串起来,程序的执行会依照这个链往下走,实现服务与服务之间的配合。

备忘录模式

类中有一个备忘录列表,每个备忘录都有一个id,ctrl+z的实现,快照机制

 

posted @ 2021-08-01 23:09  浪人2077  阅读(27)  评论(0)    收藏  举报