個人博客
工廠方法模式
模式介紹
工廠方法模式是創(chuàng)建型設(shè)計模式之一异希。
模式定義
定義一個用于創(chuàng)建對象的接口缘揪,讓子類決定實例化哪個類。
使用場景
在任何需要生成復(fù)雜對象的地方,都可以使用工廠方法模式涡真。用new就可以完成創(chuàng)建的對象無需使用工廠方法模式分俯。
簡單實現(xiàn)
定義抽象類Product
public abstract class Product {
/**
* 抽象方法,具體由子類實現(xiàn)
*/
public abstract void method();
}
定義實現(xiàn)類ProductA,ProductB
public class ProductA extends Product {
@Override
public void method() {
System.out.println("productA:method");
}
}
public class ProductB extends Product {
@Override
public void method() {
System.out.println("productB:method");
}
}
定義抽象工廠Factory
public abstract class Factory {
/**
* 抽象工廠方法哆料,具體由子類實現(xiàn)
*
* @return
*/
public abstract Product createProduct();
}
定義實現(xiàn)類FactoryA,FactoryB
public class FactoryA extends Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
public class FactoryB extends Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}
調(diào)用
public static void main(String[] args) {
Factory factory = new FactoryA();
Product product = factory.createProduct();
product.method();
}
輸出:
productA:method
public static void main(String[] args) {
Factory factory = new FactoryB();
Product product = factory.createProduct();
product.method();
}
輸出:
productB:method
這種方式缸剪,在Product的子類增加的時候,需要增加Product的實現(xiàn)以及Factory的實現(xiàn)东亦⌒咏冢可以利用反射的方式更簡潔地擴展,增加Product的子類時,不需要再增加Factory的子類
public abstract class AbstractFactory {
/**
* 抽象工廠方法典阵,具體由子類實現(xiàn)
*
* @param clz
* @return
*/
public abstract <T extends Product> T createProduct(Class<T> clz);
}
public class FactoryImpl extends AbstractFactory {
@Override
public <T extends Product> T createProduct(Class<T> clz) {
Product product = null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
調(diào)用
public static void main(String[] args) {
AbstractFactory factory = new FactoryImpl();
Product product = factory.createProduct(ProductA.class);
product.method();
}
輸出結(jié)果:
productA:method
調(diào)用
public static void main(String[] args) {
AbstractFactory factory = new FactoryImpl();
Product product = factory.createProduct(ProductB.class);
product.method();
}
輸出結(jié)果:
productB:method
小結(jié)
總的來說奋渔,工廠方法模式是一個很好的設(shè)計模式,但是缺點也是難以避免的壮啊,每次我們?yōu)楣S方法模式添加新的產(chǎn)品時就要編寫一個新的產(chǎn)品類卒稳,同時還要引入抽象層,這必然會導(dǎo)致類結(jié)構(gòu)的復(fù)雜化他巨,所以在某些情況比較簡單時充坑,是否要使用工廠方法 模式,需要設(shè)計者權(quán)衡利弊染突。