前言
开发中我们经常会使用到一些后缀为Factory的类,例如:BeanFactory、LoggerFactory等等。这些类其实就是一些工厂类,为我们创建项目中需要的一些对象。
什么是工厂模式
定义
将对象的创建与使用分离
实现方式
工厂模式的两种不同实现方式:
- 简单工厂模式(静态工厂方法模式)
- 工厂方法模式
简单工厂模式(静态工厂方法模式)
图解
实现
代码
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);
优点
- 工厂负责判断生产哪一种产品,调用生产方法,返回对应产品,工厂和产品职责分明。
- 客户端无需知道具体类名,直接通过参数让工厂提供想要的产品。
缺点
- 工厂类单一,负责所有产品的创建,一旦工厂类异常,会影响其它产品的创建。
- 当需要增加产品种类的时候,需要修改代码,违反开闭原则。
- 判断逻辑会随着产品种类变多变得越来越复杂,代码臃肿。
工厂方法模式
图解
实现
代码
抽象产品接口
//抽象产品:提供产品生产细节
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();
}
}
打印输出
显示屏工厂开工-->生产显示屏
显示屏生产完成
工厂方法模式其实是在简单工厂的基础上进一步的抽象,满足了开闭原则
优点
- 找对应工厂生产对应产品,无需了解生产细节
- 增加新产品只需增加对应的工厂类,无需修改源码,遵循开闭原则
- 解耦
缺点
- 一个工厂只能生产一种产品,工厂类的数量多,增加复杂度
- 增加系统抽象性,加大理解难度