设计模式三:抽象工厂

利用超级工厂来创建各自的产品工厂;将一系列的产品统一到一起创建,但由于超级工厂创建的时候就规定了产品集的种类,所以后期扩展新的产品会比较麻烦

流程图

 也许不好理解,反正我第一次捋这张图也捋了挺久

主要在于理解四个关键词:抽象产品具体产品抽象工厂(超级工厂)、具体工厂(生产工厂)

1、抽象产品决定抽象工厂:多少种抽象产品就有多少条抽象生产线

2、抽象产品和不同用户决定具体产品:抽象产品A类和不同用户B,具体产品类有A*B这么多(因为每个用户的抽象产品实现出来都不一样)

3、抽象工厂和不同用户决定具体工厂:不同用户都有各自的生产工厂,通过继承抽象工厂建造生产线,在用生产线创造具体产品

可实际上不同用户并不重要,仅仅是来区分不同的具体产品和具体工厂

步骤

第一步:抽象产品接口规定产品(猫有这些特点,狗有那些特点)、超级工厂接口规定生产线(宠物店有猫和狗买)

interface Cat {          //猫接口:名字、叫、高度、抓老鼠(产品一)
    void Name();
    void Call();
    void High();
    void Kill();
}
interface Dog {         //狗接口:名字、叫、重量、看门(产品二)
    void Name();
    void Call();
    void Weight();
    void LookDool();
}
interface PetShop {      //宠物店:超级工厂,规定生产线
    Cat Cat();
    Dog Dog();
}

第二步:具体产品类(不同用户的同一产品是不同的,小王喜欢的猫和小李喜欢的猫是不同的,所以两个人两个动物就会有四个具体产品类)

class wangCat implements Cat {                   //小王的猫
    @Override
    public void Name() {
        System.out.println("小王的猫");
    }
    @Override
    public void Call() {
        System.out.println("一次喵一声");
    }
    @Override
    public void High() {
        System.out.println("身高30厘米");
    }
    @Override
    public void Kill() {
        System.out.println("一天抓一只老鼠");
    }
}
class liCat implements Cat {                       //小李的猫
    @Override
    public void Name() {
        System.out.println("小李的猫");
    }
    @Override
    public void Call() {
        System.out.println("一次喵两声");
    }
    @Override
    public void High() {
        System.out.println("身高40厘米");
    }
    @Override
    public void Kill() {
        System.out.println("一天抓两只老鼠");
    }
}
class wangDog implements Dog {                       //小王的狗
    @Override
    public void Name() {
        System.out.println("小王的狗");
    }
    @Override
    public void Call() {
        System.out.println("一次汪一声");
    }
    @Override
    public void Weight() {
        System.out.println("体重10千克");
    }
    @Override
    public void LookDool() {
        System.out.println("看门一小时");
    }
}
class liDog implements Dog {                           //小李的狗
    @Override
    public void Name() {
        System.out.println("小李的狗");
    }
    @Override
    public void Call() {
        System.out.println("一次汪两声");
    }
    @Override
    public void Weight() {
        System.out.println("体重20千克");
    }
    @Override
    public void LookDool() {
        System.out.println("看门两小时");
    }
}

第三步:具体工厂实现抽象工厂接口,并重写方法进行实例化(小王和小李都去宠物店买猫和狗,在这里猫和狗才是真的买到了)

class xiaowang implements PetShop {  //小王去宠物店买猫和狗:工厂继承超级工厂
    @Override
    public Cat Cat() {
        return new wangCat();
    }
    @Override
    public Dog Dog() {
        return new wangDog();
    }
}
class xiaoli implements PetShop {  //小李去宠物店买猫和狗:工厂继承超级工厂
    @Override
    public Cat Cat() {
        return new liCat();
    }
    @Override
    public Dog Dog() {
        return new liDog();
    }
}

 第四步:可以看到,Main方法里new出对应工厂类(实现类)时,就可以决定创建哪一个产品了,比如图中小王就可以买一只猫或者一只狗,而且买了猫之后,也可以查看猫的相关属性和方法

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值