一起走进工厂方法模式

一. 简单工厂思想

在学习工厂方法模式前,先来了解一下简单工厂的缺点

  • 违背了开闭原则(对扩展开放,对修改关闭)
  • 扩展性不高(要去改动getProduct方法)
  • 工厂类(SimpleFactory)与ProductA、ProductB、ProductC的耦合度太高
class SimpleFactory {
    
     
    //根据type创建不同的产品
    public Product createProduct(int type) {
    
    
        if (type == 0) {
    
    
           return new ProductA();
        } else if (type == 1) {
    
    
           return new ProductB();
        } else{
    
    
            throw new IllegalArgumentException();
        }
    }
}

二.介绍

工厂方法模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。工厂方法模式的本质是将接口/抽象类的实例化过程推迟到了子类,软件中易变的细节可以从派生的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类

三.UML类图

在这里插入图片描述

四.具体代码

public class Shop {
    
    
    private Creator creator;

    public void setCreator(Creator creator) {
    
    
        this.creator = creator;
    }

    public void offerProduct(){
    
    
        System.out.println(creator.createProduct().getName());
    }

    public static void main(String[] args) {
    
    
        Shop shop = new Shop();
        shop.setCreator(new ConcreteCreatorA());
        shop.offerProduct();
    }
}

//抽象产品
interface Product {
    
    
    String getName();
}

//具体产品
class ProductA implements Product {
    
    
    @Override
    public String getName() {
    
    
        return "productA";
    }
}

//具体产品
class ProductB implements Product {
    
    
    @Override
    public String getName() {
    
    
        return "productB";
    }
}

//抽象工厂
abstract class Creator {
    
    
    public abstract Product createProduct();
}

//具体工厂
class ConcreteCreatorA extends Creator {
    
    

    @Override
    public Product createProduct() {
    
    
        return new ProductA();
    }
}

//具体工厂
class ConcreteCreatorB extends Creator {
    
    

    @Override
    public Product createProduct() {
    
    
        return new ProductB();
    }
}

五.优缺点

  • 优点
    • 将创建者与具体产品解耦(Creator与ProductA、ProductB)
    • 符合开闭原则
    • 符合单一职责原则(ConcreteCreatorA去创建ProductA,ConcreteCreatorA就去创建ProductB)
  • 缺点
    • 每增加一个产品就要增加一个对应的工厂类,可能会造成类爆炸

六.在JDK中的应用

  1. 静态工厂:java.text.NumberFormat#getInstance()
    在这里插入图片描述
  2. 工厂方法:java.util.Collection#iterator
    在这里插入图片描述

おすすめ

転載: blog.csdn.net/a347635191/article/details/121728697