移动架构-原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

使用场景

以为是复制一个一摸一样的对象出来,所以说会在这个复制出来的对象上进行操作,避免破坏原来那一个对象

理解实例

在原型模式中,很多时候是由于为了操作方便,例如在工厂模式中如果需要对传入的对象做判断,从而调用其方法的时候,这样的话就会使得工厂的代码异常难维护,为了是工厂模式更利于维护,在具体类里面就可以克隆一份数据用以工厂模式里面去操作,具体用代码说明,首先依旧需要一个接口,而这个接口又需要继承一个拷贝对象的接口,这里用一个订单拆分的例子说明

public interface Prototype {
	Prototype cloneOrder();
}
public interface IOrder extends Prototype {
	int getOderNumber();
	void setOderNumber(int number);
}

在其子类中实现,这里就写一个子类

public class PersonOrder implements IOrder{
	private int oderNumber;
	private String name;

	@Override
	public int getOderNumber() {
		return oderNumber;
	}

	@Override
	public void setOderNumber(int number) {
		oderNumber=number;
	}

	public String getOrderName() {
		return name;
	}

	public void setOrderName(String name) {
		this.name=name;
	}

	@Override
	public Prototype cloneOrder() {
		PersonOrder personOrder=new PersonOrder();
		personOrder.setOderNumber(oderNumber);
		personOrder.setOrderName(name);
		return personOrder;
	}
}

那么若果在工厂模式中要获取到其方法,还要做判断,那么就会产生过多的冗余代码,此时可以选择在实现类中clone一个对象

public class OrderDealFactory {
	public void dealOrder(IOrder order) {
		System.out.println("原订单地址:" + order.hashCode());
		int number = order.getOderNumber();
		while (number > 0) {
			IOrder iOrder = (IOrder) order.cloneOrder();
			iOrder.setOderNumber(number > 1000 ? 1000 : number);
			number -= 1000;
			System.out.println("订单---number:" + iOrder.getOderNumber() +
					",地址:" + iOrder.hashCode());
		}
	}
}

如果这里实例化的对象不同,那么在操作的时候,就有可能需要转型,那么在转型前就需要使用instanceof做判断,这样就破坏了其封装性
调用测试

public class Test {

	public static void main(String[] args) {
		OrderDealFactory orderDealFactory = new OrderDealFactory();
		PersonOrder order = new PersonOrder();
		order.setOderNumber(3500);
		order.setOrderName("个人订单");
		orderDealFactory.dealOrder(order);
	}
}

打印出来的处理地址并不是源地址,保留了源地址数据的原貌

posted @ 2019-04-06 21:21  cj5785  阅读(121)  评论(0编辑  收藏  举报