设计模式精讲-工厂方法模式

设计模式精讲-工厂方法模式

模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类。
设计模式精讲-工厂方法模式

实战说明

定义一个Product接口

//稳定的生产接口
interface Product{
    public void method();
}

不同产品A,B各自实现该接口

//产品A
class ProductA implements Product{
    @Override
    public void method() {
        System.out.println("ProductA  method executed");
    }
}

//产品B
class ProductB implements Product{
    @Override
    public void method() {
        System.out.println("ProductB  method executed");
    }
}

简单工厂实现(不是设计模式)

设计模式精讲-工厂方法模式

//简单工厂
class SimpleFactory{
    public static Product createProduct(String type){
        if (type.equals("0")){
            return new ProductA();
        }else if(type.equals("1")){
            return new ProductB();
        }
        else {
            return null;
        }
    }
}

创用者,通过简单工厂创建对应产品,再执行产品对应的方法

  public static void main(String[] args) {
      Product product = SimpleFactory.createProduct("0");
      product.method();
  }

工厂方法

分析哪些是稳定不会变:要调用A,B中的方法,需要先把产品对象创建出来。
实施:抽象出来的创建产品方法createProduct,定义抽象类Application,getObject获取产品

abstract class Application{
    abstract Product createProduct();
	
    Product getObject(){
        Product product = createProduct();
        //.....
        //....
        //其他一系列业务处理,如数据填充
        return product;
    }
}

定义具体产品生产者ConcreteProductA,ConcreteProductB继承抽象类Application,实现抽象方法createProduct

class ConcreteProductA extends Application{
    @Override
    Product createProduct() {
        return new ProductA();
    }
}

class ConcreteProductB extends Application{
    @Override
    Product createProduct() {
        return new ProductB();
    }
}

调用

public class FactoryMethodTest {
  public static void main(String[] args) {
      Application application = new ConcreteProductB();
      Product product = application.getObject();
      product.method();
  }
}

应用场景

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

主要优点

1.将具体产品和创建者解耦
2.符合单一职责原则
3.符合开闭原则

源码中的应用

大家可以自行的查看,这里不做讲解

// java api 
// 静态工厂方法 
 Calendar.getInstance() 
 java.text.NumberFormat.getInstance() 
 java.util.ResourceBundle.getBundle() 
 // 工厂方法 
 java.net.URLStreamHandlerFactory 
 javax.xml.bind.JAXBContext.createMarshaller
上一篇:Mybatis源码分析4--执行sql与参数处理


下一篇:2021-12-23