设计模式

单例设计模式

饿汉式模式

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,实现了开闭原则,但是类增多了

原型模式

其实就是克隆对象。

posted @ 2021-01-24 15:52  先生胡  阅读(43)  评论(0编辑  收藏  举报