一、单例模式。
懒汉模式:加synchronized修饰 就是线程安全的,不加就是线程不安全的。
public class SingleObj { private SingleObj () {} /*私有化构造方法,在其它类中不能调用new StaZhang()创建SingleObj对象*/ private static SingleObj singleObj =null; /*getStaticZhangObj()为外部类提供调用,来返回SingleObj 的一个实例*/ public static synchronized SingleObj getStaticZhangObj() { /* 判断是否为初次调用,如果是初次调用就实例化SingleObj对象,并返回*/ if (singleObj ==null) { singleObj =new SingleObj (); return singleObj ; }else return singleObj ; } }恶汉模式:static修饰的优先加载,所以也是线程安全的。
public class SingleObject { private SingleObject(){}/*构造函数私有化*/ private static SingleObject singleObject=new SingleObject(); public static SingleObject getSingleObject(){ /*提供外部调用方法*/ return singleObject; } }二、工厂模式。
简单工厂模式:
必须创建一个共同实现的接口(生产车间接口)
/*生产车间接口*/ public interface WorkShop { /*生产方法*/ public void product(); }创建汽车生产车间类 实现 生产车间接口
public class CarworkShopImple implements WorkShop { @Override public void product() { System.out.println("生产汽车。。。"); } } 创建自行车生产车间类实现 生产创建接口 public class BikeworkShopImple implements WorkShop { @Override public void product() { System.out.println("生产自行车。。。"); }创建工厂类 根据getVehicle方法参数 匹配类 ,返回该实例对象,注意方法的返回值类型是父类接口类型
public class FactoryUtil { public WorkShop getVehicle(String name){ if (name==null) return null; else if (("car").equals(name)) return new CarworkShopImple(); else if (("bike").equals(name)) return new BikeworkShopImple(); else return null; } }调用
@Test public void test2(){ FactoryUtil factoryUtil=new FactoryUtil(); WorkShop bike=factoryUtil.getVehicle("bike"); bike.product(); WorkShop car=factoryUtil.getVehicle("car"); car.product(); }抽象工厂模式:
三、代理模式。
静态代理:
步骤一、必须创建接口
public interface Animal { public String eat(String food); }步骤二、创建接口实现类
public class Dog implements Animal { @Override public String eat(String food) { return "狗吃"+food; } }
步骤三、创建目标类的代理类
public class DogProxy implements Animal{ private Dog dog; public DogProxy(Dog dog) { this.dog=dog; } @Override public String eat(String food) { System.out.println("扩展操作"); return dog.eat(food); } }步骤四、调用
Animal animal=new DogProxy(new Dog()); String str=animal.eat("骨头"); System.out.println(str);动态代理:
步骤一、首先必须定义接口
public interface Animal { public String eat(String food); }步骤二、定义接口的实现类(目标类)
public class Dog implements Animal { @Override public String eat(String food) { return "狗吃"+food; } }步骤三、实现InvocationHandler实现类并实现构造方法初始化。(和静态代理的区别 就在于Object 类型参数)
public class MyInvocationHandler implements InvocationHandler { /*创建目标对象*/ private Object target; public MyInvocationHandler(Object target) { this.target=target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("扩展开始*****"); System.out.println("扩展结束*****"); /*相当于定义eat()方法*/ return method.invoke(target,args); } }步骤四、调用Proxy.newProxyInstance()生成代理类对象。
/*目标对象*/ Dog dog = new Dog(); /*调用函数对象*/ MyInvocationHandler myInvocationHandler=new MyInvocationHandler(dog); /*Proxy.newProxyInstance()生成的是Animal接口的实现类 和目标类Dog是兄弟关系。 */ Animal animal = (Animal) Proxy.newProxyInstance ( dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), myInvocationHandler );/*创建Dog代理对象*/ String foodDog = animal.eat("骨头"); System.out.println(foodDog);
