常用设计模式

一、Singleton(单例模式)

一句话总结:一个类在Java虚拟机中只有一个对象。
项目里:JobQueue等queue,以及生成id的mapper,统计节点状态的mapper等。
分为饿汉式和懒汉式;
饿汉式:

public class HurgrySingleton {  
	private static HurgrySingleton hurgry=new HurgrySingleton();  
	private HurgrySingleton(){};  
    public static HurgrySingleton getSinletonHurgry(){  
         return hurgry;  
     }  
}  

懒汉式:(考虑并发的话使用volatile + 双重检测 机制)

public class LarzySingleton {  
   private static LarzySingleton larzy=null;  
   private LarzySingleton(){};  
   public static LarzySingleton getSinletonLarzy(){  
        if(larzy==null){  
              larzy=new LarzySingleton();  
        }  
        return larzy;  
    }  
}  

注意的点:
1、使用懒汉模式时注意线程安全问题
2、单例模式构造方法都是私有的,是不能被继承的
3、实例和方法都是静态的。

二、Factory(简单的工厂模式)

一句话总结:用一个方法来代替new关键字
解决什么问题:对象产生过多,或者产生不同的子类。
spring的核心就是工厂模式。

public class FruitFactory {  
     public static Fruit createFruit(String name){    
         if(name.equals("apple"))
             return new Apple();  
          else if(name.equals("orange"))  
          	return new Orange();
          else
          	return new Fruit();
     }  
}  

三、装饰模式

实际场景:https://www.cnblogs.com/jzb-blog/p/6717349.html
装饰器模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。结构图如下:
在这里插入图片描述

//基础接口
public interface Component {
    
    public void biu();
}
//具体实现类
public class ConcretComponent implements Component {

    public void biu() {
        
        System.out.println("biubiubiu");
    }
}
//装饰类
public class Decorator implements Component {

    public Component component;
    
    public Decorator(Component component) {
        
        this.component = component;
    }
    
    public void biu() {
        
        this.component.biu();
    }
}
//具体装饰类
public class ConcreteDecorator extends Decorator {

    public ConcreteDecorator(Component component) {

        super(component);
    }

    public void biu() {
        
        System.out.println("ready?go!");
        this.component.biu();
    }
}

四、Proxy(代理模式)

一句话总结:为其他对象提供一个代理,以控制对当前对象的访问。
解决什么问题:不能直接访问该对象,需要使用中介。
项目里面怎么用:访问权限问题。
spring里aop用的就是代理模式
代码:由接口+被代理类+代理类组成

//接口
public interface UserDao {
    void save();
}
//被代理类
public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("----已经保存数据!----");
    }
}
 //代理类
public class UserDaoProxy implements UserDao {
    //接收保存目标对象
    private UserDao target;
    public UserDaoProxy(UserDao target){
        this.target=target;
    }

    public void save() {
        System.out.println("开始事务...");
        target.save();//执行目标对象的方法
        System.out.println("提交事务...");
    }
}

装饰模式和代理模式的关系:
1、两者的代码非常像,甚至都拿组件/被代理对象 作为成员变量
2、区别在于两者的目的不同,装饰模式是为了增强某些功能,而代理模式是为了获得被代理对象的控制权

五、适配器模式Adapter(了解即可)

一句话总结:将两个原来不兼容的类兼容起来一起工作。
在这里插入图片描述
整个流程就是通过Adapter把Adaptee转换为目标(Target)的子类。

//投影仪支持的大口
public interface BigPort {
    
    public void userBigPort();//使用的大口
}
//小口
public interface SmallPort {
    public void userSmallPort();//使用小口
}
//适配器
public class SmallToBig implements BigPort{

    private SmallPort smallPort;//小口
    
    public SmallToBig(SmallPort smallPort){//获得小口
        this.smallPort=smallPort;
    }

    public void userBigPort() {
        this.smallPort.userSmallPort();    //使用小口
    }
            
}
六、观察者模式

个人理解:其实就是activemq中的topic-subject订阅,发布一个通知,所有订阅者能收到通知并做出响应。

七、Strategy(策略模式)

一句话总结:定义一个接口,然后很多实现类制定各种策略。
解决什么问题:做一件事情有很多种方法。

public interface Person {  
    void eat();  
}  
public class India implements Person {  
    @Override  
    public void eat() {  
        System.out.println("非洲人用手吃饭");  
    }  
} 
public class America implements Person {  
    @Override  
    public void eat() {  
        System.out.println("美国人用刀叉吃饭");  
    }  
}   
public class Chinese implements Person {  
    @Override  
    public void eat() {  
        System.out.println("中国人用筷子吃饭");  
    }  
}  
八、Template(模板模式)

策略模式中接口改成抽象类。

策略模式和模板模式的区别:
关键在于:模板模式是定义一个模板,模板中有一些部分是必须执行的(抽象类中的实现),有些部分是子类自己发挥的。而策略模式仅仅是定义一个策略的名字,具体发挥全都由子类自己来完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值