Java设计模式之抽象工厂

前言

如果前面已经学习了工厂模式抽象工厂学习起来也很简单,只是对工厂模式做了关于产品族产品等级结构概念的扩展。

先解释什么是产品族和产品等级结构
比如你拥有一个衣柜,衣柜里有衬衣,有夹克,有外套,有牛仔库,有休闲裤,有西服,有西裤……

这里的衣服有休闲的,有正式的,有时尚等等多种风格,每一种风格分别又有自己的部件,比如上衣、裤子。

同一种风格、能够同时搭配的衣物组合就是一个产品族,同一个产品族下面的衣帽裤鞋就是不同的产品等级结构。比如西装、西裤、皮鞋,这就属于同一产品族,而T恤和牛仔裤就是另一个产品族;而牛仔库和西裤又属于同一产品等级结构

抽象工厂使用厂场景:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

抽象工厂

先了解了上面的概念,接下来就通过代码的形式构造上述场景所展示的设计模式。

先写出各种产品的接口

Clothe.java

// 上衣产品接口
public interface Clothe {
    void show();// 打印信息
}

Pant.java

// 裤子产品接口
public interface Pant {
    void show();// 打印信息
}

Shoe.java

// 鞋子产品接口
public interface Shoe {
    void show();// 打印信息
}

接下来分别写出西装休闲装这两个产品族的具体产品实现类

西装产品族:
WesternClothe.java

// 西装上衣产品
public class WesternClothe implements Clothe {
    @Override
    public void show() {
        System.out.println("西服");
    }
}

WesternPant.java

// 西裤产品
public class WesternPant implements Pant {
    @Override
    public void show() {
        System.out.println("西裤");
    }
}

LeatherShoes.java

// 皮鞋产品
public class LeatherShoes implements Shoe {
    @Override
    public void show() {
        System.out.println("皮鞋");
    }
}

休闲装产品族:

TShirt.java

// T恤产品
public class TShirt implements Clothe {
    @Override
    public void show() {
        System.out.println("T恤");
    }
}

Jeans.java

// 牛仔裤产品
public class Jeans implements Pant {
    @Override
    public void show() {
        System.out.println("牛仔裤");
    }
}

CanvasShoe.java

// 帆布鞋产品
public class CanvasShoe implements Shoe {
    @Override
    public void show() {
        System.out.println("帆布鞋");
    }
}

然后写出工厂接口,可以注意到抽象工厂模式工厂模式的工厂接口的区别在于,工厂模式接口只生产某一类产品,而抽象工厂模式生产的是一套产品族

Factory.java

// 工厂接口
public interface Factory {
    Clothe produceCloth();// 生产上衣

    Pant producePant();// 生产裤子

    Shoe produceShoe();// 生产鞋子
}

WesternFacroty.java

// 西装产品工厂类
public class WesternFacroty implements Factory {
    @Override
    public Clothe produceCloth() {
        return new WesternClothe();
    }

    @Override
    public Pant producePant() {
        return new WesternPant();
    }

    @Override
    public Shoe produceShoe() {
        return new LeatherShoes();
    }
}

LeisureFactory.java

// 休闲装产品工厂类
public class LeisureFactory implements Factory {
    @Override
    public Clothe produceCloth() {
        return new TShirt();
    }

    @Override
    public Pant producePant() {
        return new Jeans();
    }

    @Override
    public Shoe produceShoe() {
        return new CanvasShoe();
    }
}

Main.java

// 抽象工厂调用过程
public class Main {
    public static void main(String[] args) {
        Factory factory = new WesternFacroty(); // 西装产品工厂
        Clothe clothe = factory.produceCloth(); // 生产上衣
        Pant pant = factory.producePant(); // 生产裤子
        Shoe shoe = factory.produceShoe(); // 生产鞋子
        clothe.show();  // 打印西服
        pant.show();    // 打印西裤
        shoe.show();    // 打印皮鞋
        System.out.println("===切换产品族====");
        factory = new LeisureFactory(); // 切换到休闲装产品工厂
        clothe = factory.produceCloth();// 生产上衣
        pant = factory.producePant();   // 生产裤子
        shoe = factory.produceShoe();   // 生产鞋子
        clothe.show();  // 打印T恤
        pant.show();    // 打印牛仔裤
        shoe.show();    // 打印帆布鞋
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄嘉成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值