重学设计模式-工厂模式

428 阅读3分钟

前言

开发中我们经常会使用到一些后缀为Factory的类,例如:BeanFactoryLoggerFactory等等。这些类其实就是一些工厂类,为我们创建项目中需要的一些对象。

什么是工厂模式

定义

将对象的创建与使用分离

实现方式

工厂模式的两种不同实现方式:

  • 简单工厂模式(静态工厂方法模式)
  • 工厂方法模式

简单工厂模式(静态工厂方法模式)

图解

image.png

实现

代码

package com.yang.factory;
public class Client {
    public static void main(String[] args) {
        Product product = SimpleFactory.makeProduct(1);
        assert product != null;
        product.show();
    }

    //抽象产品
    public interface Product {
        void show();
    }

    //具体产品:ProductA
    static class ProductA implements Product {
        public void show() {
            System.out.println("具体产品A显示...");
        }
    }

    //具体产品:ProductB
    static class ProductB implements Product {
        public void show() {
            System.out.println("具体产品B显示...");
        }
    }

    final class Const {
        static final int PRODUCT_A = 0;
        static final int PRODUCT_B = 1;
    }

    static class SimpleFactory {
        public static Product makeProduct(int kind) {
            switch (kind) {
                case Const.PRODUCT_A:
                    return new ProductA();
                case Const.PRODUCT_B:
                    return new ProductB();
            }
            return null;
        }
    }
}

定义一个创建产品对象的工厂类SimpleFactory,将实际创建工作推迟到具体的子类中ProductA,ProductB。将对象的创建完全交给工厂,客户端只需要通过传参获取想要的产品对象即可。
Product product = SimpleFactory.makeProduct(1);

优点

  • 工厂负责判断生产哪一种产品,调用生产方法,返回对应产品,工厂和产品职责分明。
  • 客户端无需知道具体类名,直接通过参数让工厂提供想要的产品。

缺点

  • 工厂类单一,负责所有产品的创建,一旦工厂类异常,会影响其它产品的创建。
  • 当需要增加产品种类的时候,需要修改代码,违反开闭原则。
  • 判断逻辑会随着产品种类变多变得越来越复杂,代码臃肿。

工厂方法模式

图解

image.png

实现

代码

抽象产品接口

//抽象产品:提供产品生产细节
public interface IphoneInterface {
    void print();
}

电池类

//具体产品:电池
public class Battery implements IphoneInterface {
    @Override
    public void print() {
        System.out.println("电池生产完成");
    }
}

屏幕类

//具体产品:屏幕
public class Screen implements IphoneInterface {
    @Override
    public void print() {
        System.out.println("显示屏生产完成");
    }
}

抽象工厂

//抽象工厂:提供了产品的生产方法
public interface IphoneAbstractFactory {
    public IphoneInterface newIphoneFitting();
}

电池工厂

//具体工类厂:生产电池
public class BatteryFactory implements IphoneAbstractFactory {
    @Override
    public IphoneInterface newIphoneFitting() {
        System.out.println("电池配件工厂开工-->生产电池");
        return new Battery();
    }
}

显示屏工厂

//具体工厂类 生产显示屏
public class ScreenFactory implements IphoneAbstractFactory {
    @Override
    public IphoneInterface newIphoneFitting() {
        System.out.println("显示屏工厂开工-->生产显示屏");
        return new Screen();
    }
}

测试

public class Test {
    public static void main(String[] args) {
        ScreenFactory screenFactory = new ScreenFactory();
        IphoneInterface iphoneInterface = screenFactory.newIphoneFitting();
        iphoneInterface.print();
    }
}

打印输出

显示屏工厂开工-->生产显示屏
显示屏生产完成

工厂方法模式其实是在简单工厂的基础上进一步的抽象,满足了开闭原则

优点

  • 找对应工厂生产对应产品,无需了解生产细节
  • 增加新产品只需增加对应的工厂类,无需修改源码,遵循开闭原则
  • 解耦

缺点

  • 一个工厂只能生产一种产品,工厂类的数量多,增加复杂度
  • 增加系统抽象性,加大理解难度