当创建一个对象需要依赖多个其它对象或条件,不能简单一句new完成时,可通过工厂模式封装繁杂的实例创建过程。
通常认为工厂模式包含简单工厂模式(静态工厂模式),工厂方法模式,抽象工厂模式。
简单工厂模式(静态工厂模式)
产品接口及实现类:
interface Product {
public String getProductName();
}
class Product1 implements Product {
@Override
public String getProductName() {
return "Product1";
}
}
class Product2 implements Product {
@Override
public String getProductName() {
return "Product2";
}
}
工厂类:
public class Factory {
public static Product createProduct(String productName) {
switch (productName) {
case "Product1":
return new Product1();
case "Product2":
return new Product2();
default:
return null;
}
}
}
简单工厂模式在每次新增产品类时都需要修改,违背了面向对象设计的开闭原则
这里的产品创建例子比较简单,可以通过反射来避免修改工厂
public class Factory {
public static Product createProduct(String productName) {
try {
//通过反射避免新增产品类时修改此工厂
return (Product) Class.forName(productName).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
然而,在创建对象过程较复杂的情况下,反射不能满足需求,则需要采用下文中的工厂方法模式
工厂方法模式
相比于简单工厂模式把所有产品的创建过程都放置一个工厂中,
工厂方法模式则通过各个工厂子类来创建各单独产品,让工厂具备可扩展性。
public interface Factory {
public Product createProduct(String productName);
}
class Factory1 implements Factory {
@Override
public Product createProduct(String productName) {
return new Product1();
}
}
class Factory2 implements Factory {
@Override
public Product createProduct(String productName) {
return new Product2();
}
}
抽象工厂模式
当某一产品族包含众多产品类时,对每个产品单独设立产线(工厂方法)则显得冗余。
故抽象工厂模式以产品族为单位建立工厂,并对整个产品族生产线进行抽象整合。
产品族:
//产品A和产品B构成一个产品族,A和B各有不同的具体实例A1,A2,B1,B2等
interface ProductA {
public String getProductName();
}
class ProductA1 implements ProductA {
@Override
public String getProductName() {
return "ProductA1";
}
}
class ProductA2 implements ProductA {
@Override
public String getProductName() {
return "ProductA2";
}
}
interface ProductB {
public String getProductName();
}
class ProductB1 implements ProductB {
@Override
public String getProductName() {
return "ProductB1";
}
}
class ProductB2 implements ProductB {
@Override
public String getProductName() {
return "ProductB2";
}
}
抽象工厂:
public interface Factory {
public ProductA createProductA();
public ProductB createProductB();
}