1.简单工厂
首先,简单工厂设计模式遵循的事最小知识原则,调用者不需要关心具体的对象是如何产生的。
//1.简单工厂模式Factory用于产生具体产品ProductImpl
//2.Product 抽象的产品
public abstract class Product{
public abstract void create();
}
//3.创建两个产品实现类
public class ProductImplA extends Product{
@Override
public void create(){
System.out.printIn("A has create!")
}
}
public class ProductImplB extends Product{
@Override
public void create(){
System.out.printIn("B has create!")
}
}
//4.Factory
public class Factory{
public static Product createProudct(int type){
Product product = null;
switch(type){
case 1:
product = new ProductImplA();
break;
case 2:
product = new ProductImplB();
break;
default:
break;
}
return product;
}
}
//客户端调用直接使用Factory.createProudct(1)就能产生
// ProductImplA实例对象
以上的简单工厂模式createProudct(int type)方法中,根据type值产生不同的产品实例。如果又有新的产品,那么就要对该方法的switch进行修改,这本身违背了软件设计的开闭原则,即对修改封闭,对扩展开放。用两种方法来解决这个问题,一种是利用反射,一种是利用抽象工厂。
反射解决简单工厂需要修改代码来产生新产品的功能。
public class Factory{
public static <T extends Product> T createProudct(Class<T> clazz) throw Exception{
Product product = null;
//以下两种方法都能产生product;
// product = (Product)Class.forName(clazz.getName).newInstace();
product = clazz.newInstance();
return (T)product;
}
}
2.抽象工厂
针对简单工厂的缺点抽象工厂是为了便于系统的扩展性。
//1.定义抽象工厂类用于制造产品
public abstract class IFactory{
public abstract Product createProduct();
}
//2.A工厂生产A产品
public AFactory extends IFactory{
@Override
public Product createProduct(){
return new ProductImplA()
}
}
//3.客户端调用的话直接 IFactory f = new AFactory();
//Product a = f.createProduct()
//4.便于扩展的实现方式 例:新增产品C extents Product
// 新增工厂CFactory extends IFactory
网友评论