首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >设计模式

设计模式

原创
作者头像
ruochen
修改2021-11-25 12:55:43
修改2021-11-25 12:55:43
3210
举报

为什么要使用设计模式

合理的使用设计模式,可以提高系统的健壮性,易修改性和可扩展性

六大设计原则

  1. 单一原则 :类或方法应该只有有单一的职责
  2. 里氏替换原则 :任何能使用基类的地方,都应该可以使用其子实现替换
  3. 开闭原则 :对扩展开放,对修改禁止
  4. 依赖倒置 :应该依赖接口而不是依赖具体实现,即面向接口编程,应该对外暴露接口
  5. 接口隔离原则 :每个接口应该有自己独立的功能,不要在一个接口中定义多个功能。类要实现多个功能需要实现不同功能的接口。对外暴露接口的时候,也要做到最小化接口
  6. 迪米特法则 :也叫最小知道法则,即要尽量避免与其他类的交流,应该只与内部变量,方法输入与输出中的类交流

创建型(五种):

==简单工厂模式(不属于23中设计模式)==:

根据不同的入参创建不同的对象undefined 每次增加新的对象都需要修改代码

spring中的BeanFactory就是用的简单工厂模式, 通过传入的唯一标识,返回需要的bean实例

==工厂模式==:

为每一个产品创建一个工厂类,通过不同的工厂实例来创建不同的产品undefined 方便增加同一等级的不同产品

spring中的FactoryBean接口采用了工厂方法模式,当注入相关bean时,Spring会先获取FactoryBean的实例,再调用用户实现的getObject方法返回对应的bean

==抽象工厂模式==:

为每一产品类创建一个工厂类,通过不同的工厂类来创建一类产品undefined 方便扩展产品类,但不方便在产品类中添加新的产品

简单工厂模式、工厂方法模式、抽象工厂模式,是一个由简到繁,根据需求的不断复杂化多样化而诞生的过程,工厂模式其实就是根据工厂创建对象,只不过有的是小作坊,有的是大车间

Demo:
代码语言:txt
复制
// 定义产品
代码语言:txt
复制
public interface Phone {}
代码语言:txt
复制
public interface PC {}
代码语言:txt
复制
public class MiPhone implements Phone {}
代码语言:txt
复制
public class MiPC implements PC {}
代码语言:txt
复制
public class IPhone implements Phone{}
代码语言:txt
复制
public class Mac implements PC {}
简单工厂
代码语言:txt
复制
public class SimpleFactory {
代码语言:txt
复制
    public static <T extends Phone> T makePhone(String type) {
代码语言:txt
复制
        if ("mi".equals(type)) {
代码语言:txt
复制
            return (T) new MiPhone();
代码语言:txt
复制
        } else if ("apple".equals(type)) {
代码语言:txt
复制
            return (T) new IPhone();
代码语言:txt
复制
        } else {
代码语言:txt
复制
            return null;
代码语言:txt
复制
        }
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public class Client {
代码语言:txt
复制
    public static void main(String[] args) {
代码语言:txt
复制
        MiPhone miPhone = SimpleFactory.makePhone("mi");
代码语言:txt
复制
    }
代码语言:txt
复制
}
工厂模式
代码语言:txt
复制
public interface AbstractFactory {
代码语言:txt
复制
    Phone makePhone();
代码语言:txt
复制
}
代码语言:txt
复制
public class MiFactory implements AbstractFactory {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Phone makePhone() {
代码语言:txt
复制
        return new MiPhone();
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public class AppleFactory implements AbstractFactory {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Phone makePhone() {
代码语言:txt
复制
        return new IPhone();
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public class Client {
代码语言:txt
复制
    public static void main(String[] args) {
代码语言:txt
复制
        AbstractFactory miFactory = new MiFactory();
代码语言:txt
复制
        AbstractFactory appleFactory = new AppleFactory();
代码语言:txt
复制
        MiPhone miPhone = (MiPhone) miFactory.makePhone();
代码语言:txt
复制
        IPhone iPhone = (IPhone) appleFactory.makePhone();
代码语言:txt
复制
    }
代码语言:txt
复制
}
抽象工厂模式
代码语言:txt
复制
public interface AbstractFactory {
代码语言:txt
复制
    Phone makePhone();
代码语言:txt
复制
    PC makePC();
代码语言:txt
复制
}
代码语言:txt
复制
public class MiFactory implements AbstractFactory {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Phone makePhone() {
代码语言:txt
复制
        return new MiPhone();
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public PC makePC() {
代码语言:txt
复制
        return new MiPC();
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public class AppleFactory implements AbstractFactory {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Phone makePhone() {
代码语言:txt
复制
        return new IPhone();
代码语言:txt
复制
    }
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public PC makePC() {
代码语言:txt
复制
        return new Mac();
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
public class Client {
代码语言:txt
复制
    public static void main(String[] args) {
代码语言:txt
复制
        AbstractFactory miFactory = new MiFactory();
代码语言:txt
复制
        AbstractFactory appleFactory = new AppleFactory();
代码语言:txt
复制
        miFactory.makePhone();
代码语言:txt
复制
        miFactory.makePC();
代码语言:txt
复制
        appleFactory.makePhone();
代码语言:txt
复制
        appleFactory.makePC();
代码语言:txt
复制
    }
代码语言:txt
复制
}

==单例模式==:

保证全局仅有一个对象实例,并提供一个对外的实例访问点undefined 违背了单一职责原则

单例的几种实现方式:
  1. 饿汉式

优点:线程安全undefined 缺点:不用的话,实力也会创建,浪费资源,由于在启动时就会创建,会导致启动变慢

代码语言:txt
复制
public class SingletonClass {
代码语言:txt
复制
    public static final SingletonClass INSTANCE = new SingletonClass();
代码语言:txt
复制
    private SingletonClass {}
代码语言:txt
复制
}
  1. 懒汉式

优点:使用时才加载,节约系统资源undefined 缺点:处理线程安全问题麻烦

DCL1.0 该实现方式存在缺陷, JMM设计原因导致

代码语言:txt
复制
public class SingletonClass {
代码语言:txt
复制
    private static SingletonClass instance = null;
代码语言:txt
复制
    private SingletonClass {}
代码语言:txt
复制
    public static SingletonClass getInstance() {
代码语言:txt
复制
        if (instance == null) {
代码语言:txt
复制
            synchronized (this) {
代码语言:txt
复制
                if (instance == null) {
代码语言:txt
复制
                    instance = new SingletonClass();
代码语言:txt
复制
                }
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        return instance;
代码语言:txt
复制
    }
代码语言:txt
复制
}

DLC2.0

代码语言:txt
复制
public class SingletonClass {
代码语言:txt
复制
    private static volatile SingletonClass instance = null;
代码语言:txt
复制
    private SingletonClass {}
代码语言:txt
复制
    public static SingletonClass getInstance() {
代码语言:txt
复制
        if (instance == null) {
代码语言:txt
复制
            synchronized (this) {
代码语言:txt
复制
                if (instance == null) {
代码语言:txt
复制
                    instance = new SingletonClass();
代码语言:txt
复制
                }
代码语言:txt
复制
            }
代码语言:txt
复制
        }
代码语言:txt
复制
        return instance;
代码语言:txt
复制
    }
代码语言:txt
复制
}
  1. Holder模式

优点,兼具饿汉和懒汉模式优点,线程安全,不使用不会加载,节约资源

代码语言:txt
复制
public class SingletonClass {
代码语言:txt
复制
    private static class SingletonClassHolder {
代码语言:txt
复制
        private static final SingletonClass INSTANCE = new SingletonClass();
代码语言:txt
复制
    }
代码语言:txt
复制
    private SingletonClass {}
代码语言:txt
复制
    public static SingletonClass getInstance() {
代码语言:txt
复制
        return SingletonClassHolder.INSTANCE;
代码语言:txt
复制
    }
代码语言:txt
复制
}

==思考一下,上述的几种实现方式是否有办法破坏,tips:java反射,java序列化==

  1. 枚举模式

优点:安全,简单,无多线程问题undefined 缺点:见饿汉模式

代码语言:txt
复制
public enum SingletonClass {
代码语言:txt
复制
    INSTANCE;
代码语言:txt
复制
    public void doSomthing() {
代码语言:txt
复制
        // TODO
代码语言:txt
复制
    }
代码语言:txt
复制
}

原型模式:

用于创建重复的对象,同时还能保证性能。undefined 通过实现Cloneable接口的clone方法来实现原型模式。

代码语言:txt
复制
public class PrototypeClass implements Cloneable {
代码语言:txt
复制
    @Override
代码语言:txt
复制
    public Object clone() {
代码语言:txt
复制
        Object clone = null;
代码语言:txt
复制
        try {
代码语言:txt
复制
            clone = super.clone();
代码语言:txt
复制
        } catch (CloneNotSupportedException e) {
代码语言:txt
复制
            e.printStackTrace();
代码语言:txt
复制
        }
代码语言:txt
复制
        return clone;
代码语言:txt
复制
    }
代码语言:txt
复制
}

创建者模式:

将一个复杂的对象构建与其表示分离,使得同样的构建过程可以创建不同的表示

代码语言:txt
复制
MultipartBody body = new MultipartBody.Builder()
代码语言:txt
复制
                .setType(MultipartBody.FORM)
代码语言:txt
复制
                .addFormDataPart("fileData", "a.pdf", fileBody)
代码语言:txt
复制
                .addFormDataPart("meta", "{\"thresh\":0.7}")
代码语言:txt
复制
                .addFormDataPart("token", pdfAddrToken)
代码语言:txt
复制
                .build();
代码语言:txt
复制
Request request = new Request.Builder()
代码语言:txt
复制
                .header("Content-Type", "multipart/form-data")
代码语言:txt
复制
                .post(body)
代码语言:txt
复制
                .url(addRess)
代码语言:txt
复制
                .build();

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么要使用设计模式
  • 六大设计原则
  • 创建型(五种):
    • ==简单工厂模式(不属于23中设计模式)==:
    • ==工厂模式==:
    • ==抽象工厂模式==:
    • ==单例模式==:
    • 原型模式:
    • 创建者模式:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档