基于枚举实现的工厂模式

基于枚举实现的工厂模式


例如:使用枚举来维护工厂模式产生的对象。

一、工厂模式顶级接口Product(产品)

示例:代码

package com.jareny.jave.design.factory.object;

public interface Product {

    String getName();

}

二、工厂模式接口实现实现类

1.Fruit 产品实现类(水果)

示例:代码

package com.jareny.jave.design.factory.object;

public class Fruit  implements Product {
    private final ProductCategoryEnum categoryEnum = ProductCategoryEnum.FRUIT;

    @Override
    public String getName() {
        return categoryEnum.getGategoryName();
    }
}

2. Clothes 产品实现类(衣服)

示例:代码

package com.jareny.jave.design.factory.object;

public class Clothes  implements Product {

    private final ProductCategoryEnum categoryEnum = ProductCategoryEnum.CLOTHES;

    @Override
    public String getName() {
        return categoryEnum.getGategoryName();
    }

}

3. Computer 产品实现类(电脑)

示例:代码

package com.jareny.jave.design.factory.object;

public class Computer implements Product {
    private final ProductCategoryEnum categoryEnum = ProductCategoryEnum.COMPUTER;

    @Override
    public String getName() {
        return categoryEnum.getGategoryName();
    }

}

4. Phones 产品实现类(手机)

示例:代码

package com.jareny.jave.design.factory.object;

public class Phones  implements Product {
    private final ProductCategoryEnum categoryEnum = ProductCategoryEnum.PHONES;

    @Override
    public String getName() {
        return categoryEnum.getGategoryName();
    }

}

5. Vegetable 产品实现类(蔬菜)

示例:代码

package com.jareny.jave.design.factory.object;

public class Vegetable implements Product {

    private final ProductCategoryEnum categoryEnum = ProductCategoryEnum.VEGETABLES;

    @Override
    public String getName() {
        return categoryEnum.getGategoryName();
   }

}

三、使用枚举类维护工厂模式生产的对象

package com.jareny.jave.design.factory.object;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 分类一级标题
 */
@Getter
@AllArgsConstructor
public enum ProductCategoryEnum {
    // 蔬菜
    VEGETABLES("蔬菜", 1){
        @Override
        public Product createProduct(){
            return new Vegetable();
        }
    },

    FRUIT("水果", 1){
        @Override
        public Product createProduct(){
            return new Fruit();
        }
    },

    COMPUTER("电脑", 1){
        @Override
        public Product createProduct(){
            return new Computer();
        }
    },

    PHONES("手机", 1){
        @Override
        public Product createProduct(){
            return new Phones();
        }
    },

    CLOTHES("衣服", 1){
        @Override
        public Product createProduct(){
            return new Vegetable();
        }
    }

    ;

    // 描述
    private final String gategoryName;

    // 层级
    private final Integer level;


   public abstract Product createProduct();

}

四、使用Map容器将产品注入工厂类

package com.jareny.jave.design.factory.function;

import com.jareny.jave.design.factory.object.Product;
import com.jareny.jave.design.factory.object.ProductCategoryEnum;

import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 工厂模式
 */
public class ProductFactory {

    public final static Map productMap = Stream.of(ProductCategoryEnum.values())
            .collect(Collectors.toMap(ProductCategoryEnum::name, ProductCategoryEnum::createProduct));

    public static void main(String[] args) {
        // 从工厂 获取数据
        Product product = productMap.get(ProductCategoryEnum.VEGETABLES.name());
        System.out.println(product.toString());

        // 打印所有的产品
        for (Map.Entry item : productMap.entrySet()) {
            System.out.println(item.getKey()+":"+item.getValue().getName());
        }
    }


}

五、运行结果

COMPUTER:电脑
FRUIT:水果
CLOTHES:蔬菜
PHONES:手机
VEGETABLES:蔬菜

总结

以上就是今天要讲的内容,本文使用枚举方式来生产和维护工厂模式生产的对象,在枚举中定义一个生产对象的抽象接口,然后每一个枚举类去实现这个抽象接口来生产一个对象,通过枚举的方式将产品的实现类都注入到工厂类的容器中,然后容器中根据类型来获取对应的产品。

你可能感兴趣的:(设计模式,java,intellij-idea,开发语言)