public class Client {
//从调用者代码进入
public static void main(String[] args) {
SmallProduct product=new SmallProduct();
product.setProductNumber(330);
product.setProductName("小产品A类");
DealFactory factory=new DealFactory();
factory.dealProduct(product);
}
//接下来是SmllProduct类代码
public class SmallProduct implements BaseProduct {
private int productNumber;
private String productName;
@Override
public int getProductNumber() {
// TODO Auto-generated method stub
return productNumber;
}
@Override
public void setProductNumber(int productNumber) {
// TODO Auto-generated method stub
this.productNumber=productNumber;
}
@Override
public IProType clonePro() {
// TODO Auto-generated method stub
SmallProduct product=new SmallProduct();
product.setProductNumber(productNumber);
product.setProductName(productName);
return product;
}
public String getProductName() {
return productName;
}
public void setProductName(String name) {
this.productName=name;
}
}
产品基类的代码
public interface IProType {
public IProType clonePro();
}
public interface BaseProduct extends IProType {
int getProductNumber();
void setProductNumber(int productNumber);
}
最后是工厂类代码,调用者根本就不用关心怎么保留初始“product”,调用者处理的“product”都是clone过来的,任何的修改都是在clone出来的新产品基础上进行修改,而原“product”都是不改变的,模板设计很好的隐藏的clone过程。
public class DealFactory {
public void dealProduct(BaseProduct product) {
// 如果不是模板方式,就要分类判断,不利于拓展
if (product instanceof SmallProduct) {
String name=((SmallProduct) product).getProductName();
System.out.println("test=原地址:" + product.hashCode() + "||名字:" + name);
}
//下面是模板设计模式,
int number = product.getProductNumber();
while (number > 0) {
BaseProduct pro = (BaseProduct) product.clonePro();
pro.setProductNumber(number > 100 ? 100 : number);
number -= 100;
if(product instanceof SmallProduct) {
String name1=((SmallProduct) pro).getProductName();
System.out.print("分流之后=name="+name1);
}
System.out.println("=test=分流之后=number:" + pro.getProductNumber() + "||地址:" + pro.hashCode());
}
}
}
最后的运行效果: