zoukankan      html  css  js  c++  java
  • 移动架构-原型模式

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

    使用场景

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

    理解实例

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

    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);
    	}
    }
    

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

  • 相关阅读:
    IOS4.x下UIWebView的显示问题
    UIView的动画
    (转)iPhone实战:动态改变UITableView中的Cell高度
    (原) 定制使UITabBarController的tabbar选中tabbaritem时不高亮以及换背景色(支持iPad旋转)
    IOS开发问题汇总
    (转)公钥加密技术
    [Nikon D80]南门老家
    Realtime Ray Tracing RenderMan Point Cloud
    今天败入音特美ER6i
    Practice Realistic Human Skin Rendering In RenderMan Production Pipeline
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664627.html
Copyright © 2011-2022 走看看