工廠模式的好處:
通過工廠模式可以將產品的實例化封裝起來,調用者不需要關心產品的實例化過程,方便了當開發者對產品的實例化進行修改時,不需讓調用者參與。
抽象產品類:
public abstract class Product {
public abstract void color();
}
具體產品類A:
public class ConcretePrductA extends Product{
@Override
public void color() {
System.out.println("紅色");
}
}
具體產品類B:
public class ConcretePrductB extends Product{
@Override
public void color() {
System.out.println("綠色");
}
}
抽象工廠類
public abstract class Factory {
public abstract <T extends Product> T createProduct(Class<T> clz);
}
具體工廠類
public class ConcreteFactory extends Factory{
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product p = null;
try{
p = (Product) Class.forName(clz.getName()).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return (T)p;
}
}
上述代碼我們通過利用反射來更簡潔的生產具體產品對象,只需要在工廠方法的參數列表中傳入一個Class類就可以決定究竟是要哪一個產品。
調用方式:
Factory factory = new ConcreteFactory();
Product p = factory.createProduct(ConcretePrductA.class);
p.color();
除了該種方法還可以通過創建多個具體工廠來生產具體產品,即多工廠方法模式。
public class ConcreteFactoryA extends Factory{
@Override
public Product createProduct() {
return new ConcretePrductA();
}
}
public class ConcreteFactoryB extends Factory{
@Override
public Product createProduct() {
return new ConcretePrductB();
}
}
Factory factoryA = new ConcreteFactoryA();
Product pA = factoryA.createProduct();
pA.color();
Factory factoryB = new ConcreteFactoryB();
Product pB = factoryB.createProduct();
pB.color();
另外如果確定只需一個工廠類,可以寫爲:
public class Factory{
public <T extends Product> T createProduct(Class<T> clz) {
Product p = null;
try{
p = (Product) Class.forName(clz.getName()).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return (T)p;
}
}
該種方法即爲簡單工廠模式。