个人博客
工厂方法模式
模式介绍
工厂方法模式是创建型设计模式之一。
模式定义
定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景
在任何需要生成复杂对象的地方,都可以使用工厂方法模式。用new就可以完成创建的对象无需使用工厂方法模式。
简单实现
定义抽象类Product
public abstract class Product { /** * 抽象方法,具体由子类实现 */ public abstract void method(); }
定义实现类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 { /** * 抽象工厂方法,具体由子类实现 * * @return */ public abstract Product createProduct(); }
定义实现类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(); } }
调用
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的实现以及Factory的实现。可以利用反射的方式更简洁地扩展,增加Product的子类时,不需要再增加Factory的子类
public abstract class AbstractFactory { /** * 抽象工厂方法,具体由子类实现 * * @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; } }
调用
public static void main(String[] args) { AbstractFactory factory = new FactoryImpl(); Product product = factory.createProduct(ProductA.class); product.method(); }
输出结果:
productA:method
调用
public static void main(String[] args) { AbstractFactory factory = new FactoryImpl(); Product product = factory.createProduct(ProductB.class); product.method(); }
输出结果:
productB:method
小结
总的来说,工厂方法模式是一个很好的设计模式,但是缺点也是难以避免的,每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以在某些情况比较简单时,是否要使用工厂方法 模式,需要设计者权衡利弊。
来源:https://www.cnblogs.com/milovetingting/p/12194791.html