Desc
定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method使的一个类的实例化延迟到了子类
场景
- 当你不知道改使用对象的确切类型的时候
- 当你希望为库或框架提供扩展其内部组件的方式时
优点
- 将具体产品和创建者解耦
- 符合单一职责原则
- 符合开闭原则
实现
简单工程
public class Test {
public static void main(String[] args) {
// 简单工程
Product p1 = Application.getObject("1");
p1.method();
Product p2 = Application.getObject("2");
p2.method();
}
}
class Application {
private static Product createProduct(String type) {
Product product;
switch (type) {
case "1":
product = new ProductA();
break;
case "2":
product = new ProductB();
break;
default:
product = null;
}
return product;
}
public static Product getObject(String type) {
return createProduct(type);
}
}
工厂方法
- 不同实体类
public interface Product {
public void method();
}
public class ProductA implements Product{
@Override
public void method() {
System.out.println("ProductA.method executed.");
}
}
public class ProductB implements Product{
@Override
public void method() {
System.out.println("ProductB.method executed.");
}
}
- 抽象类及具体实现类
public abstract class ProductFactory {
abstract Product createProduct();
Product getObject(){
return createProduct();
}
}
public class ProductAService extends ProductFactory {
@Override
Product createProduct() {
return new ProductA();
}
}
public class ProductBService extends ProductFactory {
@Override
Product createProduct() {
return new ProductB();
}
}
- 测试类
public static void main(String[] args) {
ProductFactory productA = new ProductAService();
Product object = productA.getObject();
object.method();
ProductFactory productB = new ProductBService();
Product object1 = productB.getObject();
object1.method();
}
标签:Product,createProduct,模式,class,public,new,工厂,method
From: https://www.cnblogs.com/zrx1/p/18235010