工厂方法模式:定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。可以这样理解工厂模式:由一个抽象工厂定义了创建产品的接口,但是具体是哪一种产品抽象工厂是不知道的,产品的实例化工作被推迟到具体工厂中。
代码实现:
抽象产品:
package com.demo.factorymethod.product;
public abstract class AbstractProduct {
public AbstractProduct() {
}
public abstract void show();
}
具体产品:
package com.demo.factorymethod.product;
public class Product1 extends AbstractProduct {
@Override
public void show() {
System.out.println("This is product1.");
}
}
抽象工厂:
package com.demo.factorymethod.factory;
import com.demo.factorymethod.product.AbstractProduct;
public interface IFactory {
public AbstractProduct createProduct();
}
具体工厂:
package com.demo.factorymethod.factory;
import com.demo.factorymethod.product.AbstractProduct;
import com.demo.factorymethod.product.Product1;
public class FactoryImpl1 implements IFactory {
public FactoryImpl1() {
}
@Override
public AbstractProduct createProduct() {
return new Product1();
}
}
测试代码:
package com.demo.factorymethod;
import com.demo.factorymethod.factory.FactoryImpl1;
import com.demo.factorymethod.factory.IFactory;
import com.demo.factorymethod.product.AbstractProduct;
public class MainApp {
public static void main(String[] args) {
IFactory factory = new FactoryImpl1();
AbstractProduct product1 = factory.createProduct();
product1.show();
}
}
结果输出:
This is a product1.
如果又想生产其他的产品Product2,在保持原有程序的稳定性的情况下,该如何修改?可以再定义一个具体的工厂去实例化新的实例对象。
代码实现:
具体产品:
package com.demo.factorymethod.product;
import com.demo.factorymethod.product.AbstractProduct;
public class Product2 extends AbstractProduct {
@Override
public void show() {
System.out.println("This is product2.");
}
}
具体工厂:
package com.demo.factorymethod.factory;
import com.demo.factorymethod.product.AbstractProduct;
import com.demo.factorymethod.product.Product2;
public class FactoryImpl2 implements IFactory {
public FactoryImpl2() {
}
@Override
public AbstractProduct createProduct() {
return new Product2();
}
}
测试代码:
package com.demo.factorymethod;
import com.demo.factorymethod.factory.FactoryImpl2;
import com.demo.factorymethod.factory.IFactory;
import com.demo.factorymethod.product.AbstractProduct;
public class MainApp {
public static void main(String[] args) {
IFactory factory = new FactoryImpl2();
AbstractProduct product2 = factory.createProduct();
product2.show();
}
}
结果输出:
This is product2.
使用工厂方法模式的适用场合:
1) 当子类的类型可能会有很多,以后需要不断增添不同的子类实现时;
2) 当一个系统尚在框架设计阶段,还不知道将来需要实例化那些具体类时;
3) 系统设计之初不需要具体对象的概念;
4) 需要生成复杂的对象时。