设计模式之代理模式与单例模式

设计模式原则

  • 单一职责原则:一个类和一不个接口只负责唯一的职责,尽量设计功能单一的接口
  • 依赖倒转原则:高层模块不应该依赖于底层模块的实现,解耦高层模块与底层模块,即面向接口编程,当实现发生变化时,只提供新的实现类,不需要修改高层模块代码。
  • 开放封闭原则:对扩展开放,对修改关闭,换句话说,当需求发生变化是,可以通过添加新模块来满足新需求,而不是修改原有代码
  • 里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能。,在软件中将基类对象替换为他的子类对象,程序不会产生任何错误,反过来不成立。
  • 接口隔离原则:使用多个隔离的接口,比使用单个接口好,降低了接口之间的耦合度和依赖,方便维护和升级
  • 合成复用原则:尽量使用组合/聚合的方式,而不是使用继承

代理模式

定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
目的:1. 通过代理对象间接访问目标对象,防止直接访问目标系统带来的不必要复杂性。2.通过代理对象对原有的业务增强。
image.png

/**创建一个业务接口和业务的实现类。*/
public interface womanToolsFactory {
    void saleWomanTools(double length);
}
public class BFactory implements womanToolsFactory{
    @Override
    public void saleWomanTools(double length) {
        System.out.println("提供一个身高为:"+length+"的模特");
    }
}
/**创建一个类实现InvocationHandler接口并重写invoke方法。*/
public class LisiHandler implements InvocationHandler {
    private Object target;

    public LisiHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        dosomeThingBefore();
        Object result = method.invoke(target, args);
        dosomeThingAfter();
        return result;
    }

    private void dosomeThingAfter() {
        System.out.println("精美包装,快递一条龙");
    }

    private void dosomeThingBefore() {
        System.out.println("根据需求,进行市场调研");
    }
}
/**调用Proxy.newProxyInstance方法生成动态代理类的class字节码并返回动态代理类的实例。*/
/**客户端调用动态代理类的具体业务方法*/
public static void main(String[] args) { 
   System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
        // 被代理对象
        BFactory bFactory = new BFactory();

        // 被代理对象类加载器
        ClassLoader classLoader = bFactory.getClass().getClassLoader();

        // 被代理对象接口集合
        Class<?>[] interfaces = bFactory.getClass().getInterfaces();

        // 请求处理器, 处理所有的代理对象上的方法调用
        LisiHandler lisiHandler = new LisiHandler(bFactory);

        // 创建代理对象
        womanToolsFactory proxy=(womanToolsFactory)Proxy.newProxyInstance(classLoader, interfaces, lisiHandler);

        // 调用代理的方法
        proxy.saleWomanTools(1.8);

    }

单例模式

//D:\java\javademo\singleton
//双重校验 +volatile 对写操作加入了内存屏障,禁止了指令重排序
public class Singleton7DCLVolatile {
    private static volatile Singleton7DCLVolatile instance;

    private Singleton7DCLVolatile(){}

    public static Singleton7DCLVolatile getInstance(){
        if(instance==null){
            synchronized (Singleton7DCLVolatile.class){
                if(instance==null){
                    instance=new Singleton7DCLVolatile();
                }
            }
        }
        return instance;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值