java代码设计模式

一、单例模式。

   懒汉模式:加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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值