2.1 定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod 使得一个类的实例化延迟到子类。

2.2 实现

  1. interface Product {
  2. public void method1();
  3. }
  4. class ProductA implements Product {
  5. @Override
  6. public void method1() {
  7. System.out.println("ProductA.method1 executed.");
  8. }
  9. }
  10. class ProductB implements Product {
  11. @Override
  12. public void method1() {
  13. System.out.println("ProductB.method1 executed.");
  14. }
  15. }

2.2.1 简单工厂方法

定义:

  1. class SimpleFactory {
  2. public static Product createProdcut(String type) {
  3. if (type.equals("0")) {
  4. return new ProductA();
  5. } else if (type.equals("1")) {
  6. return new ProductB();
  7. } else {
  8. return null;
  9. }
  10. }
  11. }

使用:

  1. public static void main(String[] args) {
  2. Product productA=SimpleFactory.createProdcut("0");
  3. productA.method1();
  4. Product productB=SimpleFactory.createProdcut("1");
  5. productB.method1();
  6. }

2.2.2 工厂方法模式

定义:

  1. abstract class Application {
  2. abstract Product createProduct();
  3. Product getObject() {
  4. Product product = createProduct();
  5. //...
  6. //...
  7. return product;
  8. }
  9. }
  10. //工厂方法具体实现类
  11. class ConcreateProductA extends Application{
  12. @Override
  13. Product createProduct() {
  14. //...
  15. //...
  16. return new ProductA();
  17. }
  18. }
  19. class ConcreateProductB extends Application{
  20. @Override
  21. Product createProduct() {
  22. //...
  23. //...
  24. return new ProductB();
  25. }
  26. }

使用:

  1. public static void main(String[] args) {
  2. Application applicationA=ConcreateProductA();
  3. Product productA=applicationA.getObject();
  4. productA.method1();
  5. Application applicationB=ConcreateProductB();
  6. Product productB=applicationB.getObject();
  7. productB.method1();
  8. }

2.3 应用场景

  1. 当你不知道改使用对象的确切类型的时候
  2. 当你希望为库或框架提供扩展其内部组件的方法时

    2.4 优点

  3. 将具体产品和创建者解耦

  4. 符合单一职责原则
  5. 符合开闭原则

    2.5 源码中应用

    ```java // java api // 静态工厂方法 Calendar.getInstance() java.text.NumberFormat.getInstance() java.util.ResourceBundle.getBundle()

// 工厂方法 java.net.URLStreamHandlerFactory javax.xml.bind.JAXBContext.createMarshaller ```