黑马程序员技术交流社区

标题: 【上海校区】常用设计模式 Java 实现 [打印本页]

作者: 孤尽    时间: 2019-4-26 18:22
标题: 【上海校区】常用设计模式 Java 实现
本帖最后由 孤尽 于 2019-4-26 18:27 编辑

常用设计模式 Java 实现

摘要: 设计模式分类 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状.

设计模式分类
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

设计模式六大原则



单例模式
什么是单例?
保证一个类只会创建一个实例
应用场景:
运行时动态获取类信息

饿汉式
[Java] 纯文本查看 复制代码
/**
* 饿汉式:
*     类初始化时,会立即加载对象,线程天生安全,效率高
*/
public class User {
    // 存在方法区,不会回收
    private static User user = new User();
    private User() {
    }

    public User getInstance() {
        return user;
    }
懒汉式
[Java] 纯文本查看 复制代码
/**
* 懒汉式:
*     类初始化时,不会真正创建对象,只有使用时才真正创建对象
*/
public class User {

    private static User user;

    private User() {
    }

    public static synchronized User getInstance() {
        if (user == null)
            user = new User();
        return user;
    }
}
静态内部类
[Java] 纯文本查看 复制代码
/**
* 静态内部类:
*     兼顾了懒汉模式的内存优化(使用时才初始化)以及饿汉模式的安全性(不会被反射入侵)
*/
public class User {
    private User(){

    }

    static class SingletonClassInstance{
        private static final User user = new User();
    }

    public static User getInstance() {
        return SingletonClassInstance.user;
    }
}
枚举方式
[Java] 纯文本查看 复制代码
/**
* 枚举:
*     枚举天生就是单例,从JVM提供保障单例,避免反射,缺点没有延迟加载
*/
public class User {
   
    private User() {
    }

    public static User getInstance() {
        return SingletonUserEnum.INSTANCE.getInstance();
    }

    static enum SingletonUserEnum{
        INSTANCE;
        private User user;
        private SingletonUserEnum() {
            user = new User();
        }

        public User getInstance() {
            return this.user;
        }
    }
}
双重检验锁
[Java] 纯文本查看 复制代码
/**
* 双重检验锁:
*     线程安全的单例模式
*/
public class User {
    private String userName;
    private volatile static User3 user3;

    private User(){

    }

    public User getInstance(){
        if (user == null) {
            synchronized (this) {
                if (user == null){
                    user = new User();
                }
            }
        }
        return user;
    }
}
如何防止反射漏洞攻击?
在类里面增加一个 flag,初始值为 false,创建对象后更改为 true,如果为 true,就抛出异常
如何选择单例创建方式?
需要延迟加载,选择静态内部类、懒汉式
不需要延迟加载,选择枚举类、饿汉式
多线程应用首选双重检验锁

工厂模式

什么是工厂模式?
实现了创建者和调用者分离,工厂模式分为简单工厂、工厂方法、抽象工厂模式
应用场景:
简单工厂
[Java] 纯文本查看 复制代码
/**
* 简单工厂相当于一个工厂有各种产品,用户无需知道具体产品的名称,只需要知道产品对应的参数即可
* 缺点是类型过多不利于扩展维护
*/
public class CarFactory {
    public static Car createrCar(String name) {
        if (name == null || name.equals(""))
            return null;
        if (name.equals("比亚迪"))
            return new BydCar();
        if (name.equals("吉利"))
            return new JiliCar();
        return null;
    }
}
工厂方法
[Java] 纯文本查看 复制代码
/**
* 核心工厂不在负责所有产品的创建,而是将具体实现交给子类
*/
public interface CarFactory {
    Car createrCar(String name);
}

class BydFactory implements CarFactory {

    @Override
    public Car createrCar(String name) {
        return new BydCar();
    }
}

class JiliFactory implements CarFactory {
    @Override
    public Car createrCar(String name) {
        return new JiliCar();
    }
}
抽象工厂模式

什么是抽象工厂模式?
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂
该超级工厂又称为其他工厂的工厂,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象
应用场景:
[Java] 纯文本查看 复制代码
/**
* 抽象工厂简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品
*/
public interface Engine {
    void run();
}

class EngineA implements Engine{

    @Override
    public void run() {
        System.out.println("发动机转速快");
    }
}

class EngineB implements Engine {

    @Override
    public void run() {
        System.out.println("发动机转速慢");
    }
}

public interface Chair {
    void run();
}

class ChairA implements Chair {

    @Override
    public void run() {
        System.out.println("自动加热");
    }
}

class ChairB implements Chair {

    @Override
    public void run() {
        System.out.println("不能加热");
    }
}

public interface CarFactory {
    // 创建发动机
    Engine createEngine();
    // 创建座椅
    Chair createChair();
}

public class JiliFactory implements CarFactory{

    @Override
    public Engine createEngine() {
        return new EngineA();
    }

    @Override
    public Chair createChair() {
        return new ChairA();
    }
}

简单工厂、工厂方法、抽象工厂小结

摘自:https://yq.aliyun.com/articles/699195?spm=a2c4e.11157919.spm-cont-list.328.146c27aeDjkp55



5.jpg (18.72 KB, 下载次数: 19)

5.jpg

6.jpg (34.19 KB, 下载次数: 18)

6.jpg

4.jpg (13.11 KB, 下载次数: 23)

4.jpg

6.jpg (34.19 KB, 下载次数: 49)

6.jpg





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2