设计模式之抽象工厂模式

作者: 愚公要移山 | 来源:发表于2019-07-09 16:46 被阅读1次

    在古代的时候,人们身上穿的衣服其实是人们自己使用织布机织的,随着社会的发展,一直到了现代社会,我们身上穿的衣服基本上都是在工厂里面做好了,直接拿到市面上去卖就好了,对于我们身上的衣服而言,由一开始的手工制作再到今天的工厂生产,这就是工厂模式。

    一、认识抽象工厂模式

    工厂模式主要分为三个:

    (1)简单工厂模式:我们的衣服在工厂里面去建造,这就是简单工厂模式
    (2)工厂方法模式:随着社会的发展,用户现在想要一身黑色的衣服、也想要一身红色的衣服。于是乎,我们开始定义一个总厂,下面有很多具体的工厂来生产不同颜色的衣服。
    (3)抽象工厂模式:随着客户的要求越来越高,不同颜色衣服还要带各种不同的鞋子去搭配。于是这个工厂又开始生产衣服又要去生产鞋子。

    今天我们将继续依照上一篇文章《工厂模式》来探讨一下抽象工厂模式,其实从上面的例子也可以看出,抽象工厂模式其实是工厂模式的升级。下面就来好好看一下抽象工厂模式的实现;

    二、抽象工厂模式实现

    对于抽象工厂模式,我们还是根据一张图来详细的分析一下

    1-抽象工厂png.png

    从上图我们可以看到,抽象工厂模式一共至少有5个角色:

    (1)用户:提需求
    (2)工厂接口:定义多个方法,比如可以生产鞋子,可以生产衣服的方法
    (3)具体工厂:对工厂接口的实现,我们在里面生产指定的产品,比如红色衣服工厂,不仅可以生产红色衣服,还可以生产红鞋子、黑色鞋子
    (4)抽象产品接口:比如这里的衣服还有鞋子
    (5)具体产品类:具体的产品类。
    如果上面的图你觉得还不足以刻画,那么直接来看代码:
    第一步:抽象产品类定义

    //首先是衣服产品
    public abstract class ClothProduct {
        public ClothProduct() {}
    }
    //下面是鞋子产品
    public abstract class ShoeProduct {
        public ShoeProduct() {};
    }
    

    第二步:具体产品类定义

    首先是具体的衣服产品:红衣服和黑衣服

    //红衣服
    public class RedClothProduct extends ClothProduct{
        public RedClothProduct() {
            System.out.println("生产红色衣服");
        }
    }
    //黑衣服
    public class BlackClothProduct extends ClothProduct {
        public BlackClothProduct() {
            System.out.println("生产黑色衣服");
        }
    }
    

    然后是具体的鞋子产品:红鞋子和黑鞋子

    //红鞋子
    public class RedShoeProduct extends ShoeProduct {
        public RedShoeProduct(){  
            System.out.println("制造--红鞋子");  
        } 
    }
    //黑鞋子
    public class BlackShoeProduct extends ShoeProduct {
        public BlackShoeProduct(){  
            System.out.println("制造--黑鞋子");  
        } 
    }
    

    第三步:工厂接口定义

    public interface AbstractFactory {
        //制造衣服
        public ClothProduct createClothProduct();
        //制造鞋子
        public ShoeProduct createShoeProduct(String shoeType);
    }
    

    第四步:具体工厂定义

    首先是红色衣服工厂:可以生产红衣服还有各种颜色的鞋子

    public class RedClothFactory implements AbstractFactory{
        //生产红鞋子
        @Override
        public ClothProduct createClothProduct() {  
            return new RedClothProduct();
        }
        //根据不同的类型生产不同的鞋子
        @Override
        public ShoeProduct createShoeProduct(String shoeType) {
            switch (shoeType) {
            case "red":
                return new RedShoeProduct();
            case "black":
                return new BlackShoeProduct();
            default:
                break;
            }
            return null;
        }
    }
    

    其次是黑色衣服工厂:可以生产黑衣服还有各种颜色的鞋子

    public class BlackClothFactory implements AbstractFactory{
        //生产黑鞋子
        @Override
        public ClothProduct createClothProduct() {  
            return new BlackClothProduct();
        }
        //根据不同的类型生产不同的鞋子
        @Override
        public ShoeProduct createShoeProduct(String shoeType) {
            switch (shoeType) {
            case "red":
                return new RedShoeProduct();
            case "black":
                return new BlackShoeProduct();
            default:
                break;
            }
            return null;
        }
    }
    

    第五步:用户类

    public class User {
        public static void main(String[] args){  
            //生产红衣服系列
            RedClothFactory redfactory=new RedClothFactory();
            redfactory.createClothProduct();
            redfactory.createShoeProduct("red");
            //redfactory.createShoeProduct("black");
            
            //生产黑衣服系列
            BlackClothFactory blackfactory=new BlackClothFactory();
            blackfactory.createClothProduct();
            blackfactory.createShoeProduct("red");
            //blackfactory.createShoeProduct("black");
        }
    }
    

    关于抽象工厂模式与工厂方法模式的区别,这里就不说了,感觉多看几遍例子就能理解。

    三、总结

    根据前面写的两篇文章,我们可能会发现无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,目的都是为了代码的解耦。在使用时,只需要关心降低耦合度的目的是否达到了。

    谢谢大家关注,如有问题还请批评指正。

    欢迎关注我的微信公众号:java的架构师技术栈。回复指定关键字可获取计算机各种视频教程(包含java全套系列、python、神经网络、Android、微信小程序等等教程)


    微信公众号.png

    相关文章

      网友评论

        本文标题:设计模式之抽象工厂模式

        本文链接:https://www.haomeiwen.com/subject/unqfkctx.html