23种设计模式

1.单例模式

详见javase第七章

2.工厂模式

创建对象时,不再需要new,对于创建者而言,不需要知道创建细节,通过getXXX()就可以得到实例对象。

  • 2.1简单工厂模式(静态工厂模式)
    用来生产同一等级结构中的任意产品
    (对于增加的新产品,需要覆盖已有代码)
public interface Car {
	void name();
}
public class CarFactory {
	//方法一
	public static Car getCar(String car) {
		
		if(car.equals("五菱")) {
			return new WuLing();
		}else if(car.equals("特斯拉")){
			return new Tesla();
		}else {
			return null;
		}
	}
	
	//方法二
	//public static Car getWuLing() {
	//	return new WuLing();
	//}
	//public static Car getTesla() {
	//	return new Tesla();
	//}
	
}
public class Tesla implements Car{

	@Override
	public void name() {
		System.out.println("特斯拉!");
	}

}
public class WuLing implements Car{

	@Override
	public void name() {
		System.out.println("五菱宏光");
	}

}
public class Consumer {
	public static void main(String[] args) {
		
		Car car = CarFactory.getCar("五菱");
		Car car2 = CarFactory.getCar("特斯拉");
		
		car.name();
		car2.name();
		
	}
}
  • 2.2工厂方法模式
    用来生产同一等级结构中的固定产品(支持增加任意产品)
public interface Car {
	void name();
}
public interface CarFactory {
	Car getCar();
}
public class TeslaFactory implements CarFactory{

	@Override
	public Car getCar() {
		return new Tesla();
	}

}
public class Tesla implements Car{

	@Override
	public void name() {
		System.out.println("特斯拉!");
	}

}
public class WulingFactory implements CarFactory{

	@Override
	public Car getCar() {
		return new WuLing();
	}

}

public class WuLing implements Car{

	@Override
	public void name() {
		System.out.println("五菱宏光");
	}

}
public class MoBaiFactory implements CarFactory{

	@Override
	public Car getCar() {
		return new MoBai();
	}

}
public class MoBai implements Car{

	@Override
	public void name() {
		System.out.println("摩拜单车");
	}
	
}
public class Consumer {
	public static void main(String[] args) {
		Car WCar = new WulingFactory().getCar();
		Car TCar = new TeslaFactory().getCar();
		Car MoBai = new MoBaiFactory().getCar();
		WCar.name();
		TCar.name();
		MoBai.name();
	}
}
  • 简单工厂模式与工厂方法模式对比
    结构复杂度:Simple
    代码复杂度:Simple
    编程复杂度:Simple
    管理上的复杂度:Simple
    根据设计模式:工厂方法模式
    根据实际业务:简单工厂模式(更为常用)
3.静态代理模式
  • 3.1 实现方式
    真实角色–You
    代理角色–WeddingCompany
    真实角色和代理角色实现公共接口(常用来记录日志)
  • 3.2 优点
    客户端不必知道实现类(委托类)的内部方法实现,只需要调用代理类即可。

例子1

public class Thread05_StaticProxy {
	public static void main(String[] args) {
		new WeddingCompany(new You()).happyMarry();
		//new Thread(线程对象).start();多线程就是此原理。
	}
}

//公共接口Marry
interface Marry{
	void happyMarry();
}

//真实角色
class You implements Marry{

	@Override
	public void happyMarry() {
		System.out.println("you and 嫦娥 终于奔月了...");
		
	}
}

//代理角色
class WeddingCompany implements Marry{

	//真实角色
	private Marry target;

	public WeddingCompany(Marry target) {
		this.target = target;
	}
	
	@Override
	public void happyMarry() {
		ready();
		this.target.happyMarry();
		after();
	}
	
	private void ready() {
		System.out.println("布置猪窝...");
	}
	
	private void after() {
		System.out.println("闹嫦娥...");
	}
}

例子2
接口:UserIface.java

//关于用户管理的接口
public interface UserIface {
	void addUser();
	void delUser();
	void updUser();
	void findUser();
	void setRole();
}

真实角色类:UserImpl.java

public class UserImpl implements UserIface {

	@Override
	public void addUser() {
		System.out.println("addUser");
	}

	@Override
	public void delUser() {
		System.out.println("delUser");
	}

	@Override
	public void updUser() {
		System.out.println("updUser");
	}

	@Override
	public void findUser() {
		System.out.println("findUser");
	}

	@Override
	public void setRole() {
		System.out.println("setRole");
	}

}

静态代理类:UserProxy.java

public class UserProxy implements UserIface {
	private UserIface iface;
	
	
	public UserProxy(UserIface iface) {
		this.iface = iface;
	}

	@Override
	public void addUser() {
		check();
		iface.addUser();
	}

	@Override
	public void delUser() {
		check();
		iface.delUser();
	}

	@Override
	public void updUser() {
		check();
		iface.updUser();
	}

	@Override
	public void findUser() {
		check();
		iface.findUser();
	}
	
	@Override
	public void setRole() {
		check();
		iface.setRole();;
	}
	
	public void check() {
		System.out.println("check");
	}
	
}

静态代理测试类:Test.java

public class Test {
	public static void main(String[] args) {
		
		//真实角色(被代理对象)
		UserIface ui = new UserImpl();
		
		//静态代理
		UserProxy userProxy = new UserProxy(ui);
		userProxy.addUser();
		userProxy.setRole();
	}
	
}
4.动态代理模式

接口:UserIface.java
与3.2代码相同

真实角色类:UserImpl.java
与3.2代码相同

动态代理类:JdkHandler.java

public class JdkHandler  implements InvocationHandler{
	
	private Object obj;//目标对象
	
	public Object newProxy(Object obj) {
		this.obj = obj;
		ClassLoader loader = obj.getClass().getClassLoader();
		Class<?>[] clasz = obj.getClass().getInterfaces();
		return Proxy.newProxyInstance(loader, clasz, this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		check();
		return method.invoke(this.obj, args);
	}
	
	private void check() {
		System.out.println("check");
	}
	
}

动态代理测试类:Test.java

public class Test {
	public static void main(String[] args) {
		//真实角色(被代理对象)
		UserIface ui = new UserImpl();
		
		//动态代理
		JdkHandler handler = new JdkHandler();
		UserIface user = (UserIface) handler.newProxy(ui);
		user.addUser();
		user.setRole();
	}

}

动态代理优点:
与静态代理相比,静态代理类与真实角色都实现同一接口,当业务内容增加,接口中方法发生改变时,静态代理类也必须随之改变
但动态代理类并不实现与真实角色相同的接口,使用反射原理完成对真实角色的代理,所以一经定义好后,静态代理类就不再需要改变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值