• 设计模式


    单例设计模式

    饿汉式模式

    class Person{
          //1.私有化构造器
          private Person(){
                //dosomething
          }
    
          //2.类内创建 该对象,同时要求该对象是static
          private static Person personInstance = new Person();
    
          //3. 提供公共的静态方法
          public static Person getInstance(){
                return personInstance ;
          }
    }
    

    懒汉式模式

    class Person{
          //1.私有化构造器
          private Person(){
              //dosomething
          }
    
          //2.声明当前 类对象为null,同时要求该对象是static
          private static Person personInstance = null;
    
          //3. 提供公共的静态方法
          public static Person getInstance(){  //多线程时,懒汉式不安全
                if(personInstance  == null){
                      personInstance  = new Person();
                }
                return personInstance 
          }
    }
    

    饿汉式:好处--->线程安全;坏处---> 对象加载时间过长,不论用不用直接new了
    懒汉式:好处--->延迟对象的加载;坏处--->线程不安全

    懒汉式-线程安全

    // 1.
    class Person1{
        private Person1(){
            //doSomething
        }
        
        private static Person1 p= null;
        
        public static synchronized Person1 getInstance(){  //同步方法
            if (p== null){
                p= new Person1();
            }
            return p;
        }
    }
    // 2.
    public static Person1 getInstance(){
             //耗时,当第一个线程进来后,对象已经造好,后来线程不需要再判断
            synchronized (Person1.class){
                if (p == null)
                    p = new Person1();
                return p;
            }
            // 效率高
            /*if (p == null)
                synchronized (Person1.class)
                    if (p == null)
                        p = new Person1();
            return p;*/
        }
    

    代理模式

    静态代理

    /**
     * 主人委托中介卖房子
     * */
    //卖房子的接口
    interface House1{
        void sellHouse1();
    }
    //代理类(中介)
    class ProxyHouse implements House1{
    
        private Host1 host1; //真正的主人
    
        public ProxyHouse(Host1 host1){
            this.host1 = host1;
        }
    
        @Override
        public void sellHouse1() {
            seeHouse();
            host1.sellHouse1();
            money();
        }
    
        public void seeHouse(){
            System.out.println("中介带看房");
        }
    
        public void money(){
            System.out.println("收中介费");
        }
    }
    //被代理类(主人  )
    class Host1 implements House1{
    
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public void sellHouse1() {
            System.out.println("我是主人"+getName()+"我要卖房子");
        }
    }
    public class StaticProxyTest {
        public static void main(String[] args) {
            Host1 host1 = new Host1();
            host1.setName("Jack");
            ProxyHouse proxyHouse = new ProxyHouse(host1);
            proxyHouse.sellHouse1();
        }
    }
    /**结果:
    中介带看房
    我是主人Jack我要卖房子
    收中介费
    */
    

    动态代理

    //接口
    interface House{
        void rent(); //出租房子
    }
    
    //被代理类,真实类
    class Host implements House{
    
        @Override
        public void rent() {
            System.out.println("主人要租房子");
        }
    }
    
    class ProxyInvocationHandler implements InvocationHandler{
    
        //被代理的类,即真实类
        private Object obj;
        public void setObject(Object obj){
            this.obj = obj;
        }
    
        //获取代理对象
        public Object getProxyInstance(){
            //newProxyInstance(ClassLoader loader, 参数1:代理的那个类的类加载,也即真实类(被代理类)
            //                 Class<?>[] interfaces,  中介 或者 被代理类实现的接口
            //                 InvocationHandler h) //调度处理器
            return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                    obj.getClass().getInterfaces(),this);
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            before();
            //Object invoke(Object obj, Object... args)
            //参数1-obj:被代理类的对象,参数2-args:该方法形参
            Object invoke = method.invoke(obj, args);//通过反射调用方法
            after();
            return invoke;
        }
        public void before(){
            System.out.println("卖房子--前");
        }
        public void after(){
            System.out.println("卖房子--后");  
        }
    }
    
      public class DynamicProxyTest {
        public static void main(String[] args) {
            Host host = new Host(); //真实对象
            ProxyInvocationHandler pih = new ProxyInvocationHandler();
            pih.setObject(host);
            House proxyInstance = (House) pih.getProxyInstance(); //这才是代理对象
            proxyInstance.rent();  
        }
    }
    /** 结果
    卖房子--前
    主人要租房子
    卖房子--后
    */
    

    工厂模式

    实例化对象不使用new ,用工厂方法代替 ② 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们实现的类解耦。

    静态(简单)工厂模式

    编写Car接口,ACar类,BCar类,CarFactory

    //Car接口
    public interface Car {
        void name();
    }
    //ACar 类实现Car接口
    public class ACar implements Car{
        @Override
        public void name() {
            System.out.println("我是A车");
        }
    }
    //BCar 类实现Car接口
    public class BCar implements Car{
        @Override
        public void name() {
            System.out.println("我是B车");
        }
    }
    //CarFactory 工厂类
    public class CarFactory {
        public static Car getCar(String car){
            if (car.equals("A车")){
                return new ACar();
            }else if(car.equals("B车")){
                return new BCar();
            }else return null;
        }
    }
    

    编写测试类

    public void test(){
    /**  原始写法
            Car car2 = new ACar();
            car2.name();
            Car car3 = new BCar();
            car3.name();
    */
        //工厂模式的写法  在这里不用new car()对象,也就是不用知道内部造车的细节。只需要通过工厂拿到车即可
            Car car = CarFactory.getCar("A车");  
            car.name();
            Car car1 = CarFactory.getCar("B车");
            car1.name();
        }
    

    该简单工厂模式存在的问题:不遵循开闭原则(开闭原则:不修改原来的代码,同时可以增加模块功能),若:此时在 加一个CCar类,则工厂CarFactory里面的代码逻辑就要修改,违法了开闭原则。

    工厂方法模式

    编写Car接口和CarFactory

    //Car
    public interface Car {
        void name();
    }
    //CarFactory
    public interface CarFactory {
        Car getCar();
    }
    

    编写ACar类,AcarFactory类 让AcarFactory实现CarFactory

    public class ACar implements Car {
        @Override
        public void name() {
            System.out.println("我是A车");
        }
    }
    public class ACarFactory implements CarFactory{
        @Override
        public Car getCar() {
            return new ACar();
        }
    }
    

    编写BCar类,BcarFactory类 让BcarFactory实现CarFactory

    public class BCar implements Car {
        @Override
        public void name() {
            System.out.println("我是B车");
        }
    }
    public class BCarFactory implements CarFactory{
        @Override
        public Car getCar() {
            return new BCar();
        }
    }
    

    编写测试类:

    public void test(){
            Car car = new ACarFactory().getCar();  //造A车
            car.name();
            Car car1 = new BCarFactory().getCar(); //造B车
            car1.name();
        }
    

    当继续扩展C车时,只需要编写CCar类和CCarFactory,实现了开闭原则,但是类增多了

    原型模式

    其实就是克隆对象。

  • 相关阅读:
    10、驱动中的阻塞与非阻塞IO
    8、Linux设备驱动的并发控制
    入职一个月考核学习
    5、映射的思考
    6、udev机制
    7、字符设备系统
    linux 内存管理之kmalloc、vmalloc、malloc、get_gree_pages的区别
    嵌入式笔试题(linux基础)
    驱动总结
    系统移植总结
  • 原文地址:https://www.cnblogs.com/huyuqing/p/14321146.html
Copyright © 2020-2023  润新知