Java设计模式之抽象工厂模式

2018-08-22  本文已影响6人  BestbpF

简述

前面我们学习过简单工厂模式,它解决了一类对象的创建问题,但是有的时候对象很复杂,数量多,还分为了好几种类别。如果只有一个工厂,面多如此多的产品,这个工厂需要实现的逻辑就太复杂了,所以我们希望把工厂分为好几个,便于产品规则的维护。设计者只需要提供给用户一个抽象工厂,抽象工厂内部会自动选择使用哪个工厂生产哪种产品

案例

【产品接口】

public interface IProduct {
    //案例中不提供实现类,以打印到控制台的方式说明
}

【工厂接口】

/**
 * 抽象工厂和具体工厂都要实现本接口
 */
public interface IProductFactory {
    public IProduct createProduct(String productNo);
}

【具体工厂1 - 水果】

public class ProductFactory1 implements IProductFactory {
    /**
     * @param productNo 产品编号
     * @return 本具体工厂只负责生产水果,水果编号都以A开头
     */
    @Override
    public IProduct createProduct(String productNo) {
        //这里不提供IProduct的实现类,以打印文字的方法简略表示
        if("A1".equals(productNo)){
            System.out.println("生产一个苹果");
        }else if ("A2".equals(productNo)){
            System.out.println("生产一个鸭梨");
        }else {
            System.out.println("水果工厂暂不生产该水果");
        }

        return null;
    }
}

【具体工厂2 - 文具】

/**
 * 本具体工厂只生产文具,产品编号以B开头
 */
public class ProductFactory2 implements IProductFactory {
    @Override
    public IProduct createProduct(String productNo) {
        if("B1".equals(productNo)){
            System.out.println("生产了一支笔");
        }else if ("B2".equals(productNo)){
            System.out.println("生产了一个橡皮");
        }else {
            System.out.println("本文具工厂暂不生产该文具");
        }
        return null;
    }
}

【抽象工厂】

/**
 * 抽象工厂,负责制定某个具体工厂生产某件产品
 */
public class ProductFactory implements IProductFactory {

    public IProduct createProduct(String productNo) {
        char type = productNo.charAt(0);
        IProductFactory factory = null;

        if(type == 'A'){
            factory = new ProductFactory1();
        }else if(type == 'B'){
            factory = new ProductFactory2();
        }

        if(factory != null) factory.createProduct(productNo);

        return null;
    }
}

【测试】

public class Test {
    public static void main(String[] args) {

        ProductFactory productFactory = new ProductFactory();
        productFactory.createProduct("A1");//生产一个苹果
        productFactory.createProduct("A2");//生产一个鸭梨
        productFactory.createProduct("B1");//生产了一支笔
        productFactory.createProduct("B2");//生产了一个橡皮
    }
}
上一篇 下一篇

猜你喜欢

热点阅读