常用的设计模式详解。

目录

工厂模式(创建型)

适配器模式(行为模式)

观察者模式(行为模式)

单例模式


工厂模式(创建型)

1、简单工厂模式:

        又称静态工厂方法,根据参数的不同返回不同类的实例。简单工厂模式就是专门定义一个类来负责创建其他类的实例。比如说Java中工具类DateFormat,根据传入参数的不同,可以返回不同时间格式的类

2、工厂模式(接口)

        简单工厂模式的那个工厂是需要知道所有类的实现细节的。每当有新产品要加入的时候就要去修改工厂类,在工厂模式中,这个实例化的细节放到了子工厂类中去做,这个工厂变成了接口工厂,原来简单工厂模式中,添加一个新类的时候,需要在工厂类中添加新类的实例化逻辑,而现在只需要新增一个工厂类即可。扩展优于修改。

        在JDK中,最常见的就是集合类Collection,它里面有一个iterator接口方法,Colletcion的实现类中的ArrayList实现iterator方法是创建一个Itr()对象,而实现类LinkedList中的iterator是创建一个ListItr对象。这里面的Collection就是工厂,ArrayList和LinkedList实现iterator接口方法的过程就是实例化对象,这个过程交给了ArrayList和LinkedList这两个类。

3、抽象工厂模式

        上面的简单工厂和工厂模式都是工厂和实例有关系的,而抽象工厂模式就是打破了工厂与产品(大类)一对一的关系。一个工厂类可以生成多个大类的产品。此时的工厂变成了北京工厂,广东工厂。

 

适配器模式(行为模式)

        适配器就是一个桥梁,使两个不兼容的类或者对象兼容到一起工作

        定义:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作。

        和装饰者模式的区别:目的不一样,适配器只是因为原有接口不兼容,然后适配器提供一个转换的作用,不会改变原有的接口;而装饰者就是为了对原有接口进行功能扩展,需要修改原来的接口

JDK  JUC中。FutureTask的参数是一个Runnable的时候,底层会RunnableAdapter适配器会把Runnable封装为Callable

public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
    }
public FutureTask(Runnable runnable, V result) {
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }

Executor.callable方法:

public static <T> Callable<T> callable(Runnable task, T result) {
        if (task == null)
            throw new NullPointerException();
        return new RunnableAdapter<T>(task, result);
    }
static final class RunnableAdapter<T> implements Callable<T> {
        final Runnable task;
        final T result;
        RunnableAdapter(Runnable task, T result) {
            this.task = task;
            this.result = result;
        }
        public T call() {
            task.run();
            return result;
        }
    }

观察者模式(行为模式)

        定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆可得到通知并被自动更新。

java.util包中提供了Observable类和Observer接口,其中要求,被观察者需要继承Observable类,观察则需要实现Observer接口

手写观察者模式

package ao.com;

import java.util.Observable;

public class HuaweiP30 extends Observable {
    private double money;

    public HuaweiP30(double money){
        this.money = money;
    }
    public  void setMoney(double money){
        if (money != this.money){
            setChanged();//价格改变
        }
        if (money < this.money){
            this.notifyObservers(money);//通知观察者并把改变后的钱带过去
        }
    }
    @Override
    public String toString() {
        return "HuaweiP30{" +
                "money=" + money +
                '}';
    }
}

定义华为粉丝为观察者,并实现Observer接口,并重写update(Observable o, Object arg)方法。

package ao.com;

import java.util.Observable;
import java.util.Observer;

public class Fensi implements Observer {
    private String name;
    public Fensi(String name){
        this.name = name;
    }
    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof HuaweiP30){
            System.out.println("粉丝名为" + name + "发现华为p30降价了,新的价格为:" + arg +"元,开始购买。");
        }
    }
}
public static void main(String[] args) {
        HuaweiP30 huaweiP30 = new HuaweiP30(5000);
        Fensi a = new Fensi("张奥");
        Fensi b = new Fensi("小明");
        huaweiP30.addObserver(a);
        huaweiP30.addObserver(b);
        huaweiP30.setMoney(4000);
    }

 Spring AOP用到的代理模式。

单例模式

        一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。

class Singleton {
    private volatile  static Singleton singleton;
    private Singleton(){};
    public static Singleton getInstance(){
        if (singleton == null){
            synchronized (Singleton.class){
                if (singleton == null){
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失忆机器

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值