工厂方法模式[Factory Mothod]

工厂方法模式[Factory Mothod]

模式定义:

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

设计模式对稳定的部分提炼出来,成为一种模式。

应用场景:

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

主要优点:

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

工厂方法模式的结构
工厂方法模式的主要角色如下。
1:抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
2:具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
3:抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
4:具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

重构前:

package factorymethod;

public class FactoryMethod {
    public static void main(String[] args) {

        Application application = new Application();
        ProductA product = application.getObject();
        product.method1();
    }
}

class ProductA {
    public void method1(){
        System.out.println("ProductA.method1 executed.");
    }
}

class Application{
    private ProductA createProduct(){
        return new ProductA();
    }
    ProductA getObject(){
        //创建一个实例,并返回
        ProductA product = createProduct();
        return product;
    }
}

简单工厂重构后:

package factorymethod;

public class FactoryMethod {
    public static void main(String[] args) {

        Application application = new Application();
        Product product1 = application.getObject("0");
        Product product2 = application.getObject("1");
        product1.method1();
        product2.method1();
    }
}

interface Product{
    public void method1();
}

class ProductA implements  Product{
    //假设method1是稳定的代码
    @Override
    public void method1(){
        System.out.println("ProductA.method1 executed.");
    }
}

class ProductA1 implements  Product{
    //假设method1是稳定的代码
    @Override
    public void method1(){
        System.out.println("ProductA1.method1 executed.");
    }
}


class SimpleFactory{
    public static Product createProduct(String type){
        if (type.equals("0")){
            return new ProductA();
        }else if(type.equals("1")){
            return new ProductA1();
        }else{
            return null;
        }
    }
}

class Application{
    private Product createProduct(String type){

        return SimpleFactory.createProduct(type) ;
    }
    Product getObject(String type){
        //创建一个实例,并返回
        Product product = createProduct(type);
        return product;
    }
}

工厂方法的重构:

package factorymethod;

public class FactoryMethod {
    public static void main(String[] args) {

        Application application = new ConcreateProductA1();
        Product product1 = application.getObject();
        product1.method1();

    }
}

interface Product{
    public void method1();
}

class ProductA implements  Product{
    //假设method1是稳定的代码
    @Override
    public void method1(){
        System.out.println("ProductA.method1 executed.");
    }
}

class ProductA1 implements  Product{
    //假设method1是稳定的代码
    @Override
    public void method1(){
        System.out.println("ProductA1.method1 executed.");
    }
}




 abstract  class Application{
    abstract Product createProduct();
    Product getObject(){
        //创建一个实例,并返回
        Product product = createProduct();
        return product;
    }
}

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

class ConcreteProductA1 extends Application{
    @Override
    Product createProduct() {
        return new ProductA1();
    }
}

源码中的应用:

  • 静态工厂方法

    Calendar.getInstance()
    java.text.NumberFormat.getInstance()
        
    
  • 工厂方法

    java.net.URLStreamHandlerFactory
    
posted @ 2020-07-23 16:20  Noob52037  阅读(149)  评论(0编辑  收藏  举报