工厂设计模式(2)—枚举实现工厂模式

工厂设计模式(1)—普通的工厂模式
工厂设计模式(2)—枚举实现工厂模式

1. 简单工厂模式的核心

  • 工厂角色

简单工厂模式的核心,负责创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品对象。

  • 抽象产品角色

所创建所有对象的父类,负责描述所有实例的所共有的公共接口。

  • 具体产品角色

所创建的具体实例对象。

2. 枚举类实现工厂模式的两种方法

1. 枚举非静态方法实现工厂模式

每个枚举项都是该枚举类的实例对象,那么是不是定义一个方法便可以生成每个枚举项对应产品。

1. 抽象产品角色

public interface Car {
    String name();
}

2. 具体产品角色

public class BuickCar implements Car {
    @Override
    public String name() {
        return "This is BuickCar";
    }
}
public class FordCar implements Car {
    @Override
    public String name() {
        return "This is FordCar";
    }
}

3. 产品工厂

public enum CarFactory {

    //定义可以生产汽车的类型
    FordCar, BuickCar;

    public Car create() {
        switch (this) {
            case FordCar:
                return new FordCar();
            case BuickCar:
                return new BuickCar();
            default:
                throw new AssertionError("无效参数");
        }
    }
}

4. 调用方式

    @Test
    public void testStaticFactory() {
        Car car = CarFactory.FordCar.create();
        System.out.println(car.name());
    }

2. 抽象方法生成产品

枚举类型虽然不能继承,但是可以用abstract修饰其方法,此时表示该枚举是一个抽象枚举对象,需要每个枚举项自行实现该方法。

1. 工厂方法

public enum AbstractCarFactory {

    FordCar {
        @Override
        public Car create() {
            return new FordCar();
        }
    },

    BuickCar {
        @Override
        public Car create() {
            return new BuickCar();
        }
    };
    //抽象的生产方法
    public abstract Car create();
}

2. 调用类

    @Test
    public void testAbstractFactory(){
        Car car = AbstractCarFactory.BuickCar.create();
        System.out.println(car.name());
    }

3. 枚举类实现工厂模式的优点

1. 避免错误调用的产生

一般的静态工厂模式,需要接受客户端的参数来选择哪种具体产品的构建,这无形中会产生错误(比如null值问题,Class对象不存在)。但是枚举类型产生的工厂模式便不存在该问题,不需要传递任何参数,只需要选择生成什么类型的产品即可。

2. 性能好,使用便捷

枚举类型的计算是以int类型的计算为基础的,这是最基本的操作,性能当然很快。

3. 降低类间的耦合

普通方式实现的工厂模式,无论生产方法接收的是Class、String、Int类型,都会成为客户端的负担,这些类并不是客户度需要的,而是因为工厂方法的限制必须输入的。其实也就违背了Lod(最少知识原则):一个对象应该对其他对象有最少的了解。

你可能感兴趣的:(工厂设计模式(2)—枚举实现工厂模式)