工厂方法模式
1.定义
工厂(Factory Method)模式标准定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类.
说明:工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.”
2.实现
2.1 定义产品
/**
* 抽象产品(Product)角色
*/
public interface Product {
/**
* 获取产品类型
* @return
*/
String getProductType();
/**
* 使用产品
*/
void useProduct();
}
2.2 定义工厂
/**
* 抽象工厂(Creator)角色
*/
public interface Company {
/**
* 根据产品类型构建产品
* @param productType 产品类型
* @return 具体的产品实现
*/
Product buildProduct(String productType);
}
2.3 产品的具体实现
产品A
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ProductA具体产品(Concrete Product)角色
*/
public class ProductA implements Product {
private static final Logger loger = LoggerFactory.getLogger(ProductA.class);
/**
* 产品类型
*/
private static String productType = "A";
@Override
public String getProductType() {
return productType;
}
@Override
public void useProduct() {
loger.info("使用产品B");
}
}
产品B
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ProductB具体产品(Concrete Product)角色
*/
public class ProductB implements Product {
private static final Logger loger = LoggerFactory.getLogger(ProductB.class);
/**
* 产品类型
*/
private static String productType = "B";
@Override
public String getProductType() {
return productType;
}
@Override
public void useProduct() {
loger.info("使用产品B");
}
}
2.4 工厂的具体实现
/**
* 具体工厂(Concrete Creator)角色
*/
public class CompanyImpl implements Company {
@Override
public Product buildProduct(String productType) {
if (productType.equals("A")) {
return new ProductA();
} else if (productType.equals("B")) {
return new ProductB();
}
return null;
}
}
3.工厂模式测试
/**
* 测试使用产品
*/
public class Client {
public static void main(String[] args) {
Company company = new CompanyImpl();
//根据传入的参数得到ProductA产品
Product product = company.buildProduct("A");
product.useProduct();
//根据传入的参数得到ProductB产品
product = company.buildProduct("B");
product.useProduct();
// [main] INFO ProductA - 使用产品B
// [main] INFO ProductB - 使用产品B
}
}