简单工厂的实质是将消费类对具体产品类的依赖,转换成对产品接口的依赖,而其核心是在工厂中决定提供给消费类的具体产品是什么,将使用具体产品的逻辑从消费类中集中转移到工厂,简化消费类的开发。
非常简单的Demo
package pattern;
public class SimpleFactoryDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Comsumer comsumer=new Comsumer(Factory.getProduct());
comsumer.doConsumerJob();
}
}
//共同的接口或抽象父类是产品必须实现的
interface IProduct {
void printIdentity();
}
class ProductA implements IProduct {
@Override
public void printIdentity() {
// TODO Auto-generated method stub
System.out.println("I'm A");
}
}
class ProductB implements IProduct {
@Override
public void printIdentity() {
// TODO Auto-generated method stub
System.out.println("I'm B");
}
}
class Comsumer {
// 消费类只需要使用产品,而不需要关心产品的生成和具体行为
private IProduct product;
public Comsumer(IProduct product) {
this.product = product;
}
public void setProduct(IProduct product) {
this.product = product;
}
public void doConsumerJob() {
this.product.printIdentity();
}
}
class Factory {
//工厂类负责决定创建那个产品,可以加入判断逻辑
public static IProduct getProduct() {
//这是一个非常简单的判断逻辑,决定生产A还是B
int i = (int) (Math.random() * 20);
if (i % 2 == 0)
return new ProductA();
else
return new ProductB();
}
}
其缺点在于工厂与产品类耦合非常紧密,而且判断逻辑在产品增加之后必须修改工厂类的代码。