《设计模式奇妙之旅》第3章 抽象工厂模式

第3章 抽象工厂模式

3.1 关于抽象工厂模式

我们在上面学习了,工厂方法模式,如果我们以前没有正确的使用过面向对象的知识。我们会惊讶 工厂方法模式 ,
oh my gad原来还有这种操作。这次我们即将学习的一种设计模式叫做 抽象工厂模式 。我们先来揣摩一下这个名字,能不能大概猜出它是怎样的呢。
我们不如先回顾一下 工厂方法模式 这个名字 工厂:我们让一个类使用其方法作为对象的创作者,外部只需要赋予它指令,工厂方法创建一个新的相应对象返回给调用者。

抽象工厂模式是用一个工厂创建其他工厂。这个设计模式属于创建型模式,它提供了一种创建对象的方式。

抽象工厂模式 我们是不是要把工厂给抽象起来,用抽象类实现,编写出许多工厂类继承抽象工厂类,各自的工厂类实现创建相应的对象实体。以实现隐藏对象创建的细节。
不要要慌,我们慢慢地往下面看。我希望你可以把这个系列地博客当做吃饭时可以快速阅读地小故事一样。利用碎片化的时间来达到学到知识的效果。
在这个互联网盛行的时代,我们好像都变得非常地忙碌,一天下来躺在床上一想今天好像没有做太多有价值地东西。但我相信,利用平时的点滴来积累我们总会比哪些没有学过的人要强许多。

加油吧!禄哥一直会再次陪伴你,知道把这些常见的设计模式过一边,我不是什么有丰富经验的工作开发者,也不是某个领域的专家。我只是一个在双非学校没见过什么世面的无名本科生。我都可以坚持下去、何况你呢?

3.2 来一个小故事

一家衣服工厂,正在生产不同的衣服套装,例如上衣与下衣有不同的搭配,但总是按搭配成对生产的。也就是以生产就是一套。
然而有各种各样的上衣与下衣,我们怎样来构建一个易管理的程序呢。我们一起来看一看抽象工厂模式。

3.3 试着编写下代码

先看一下类图
在这里插入图片描述

可见创建一个超级工厂,这个超级工厂是抽象的,使用上衣工厂与下衣工厂来继承超级工厂,实现各自需要实现的工厂方法。
BottomDress 与 TopDress接口将上衣与下衣进行了抽象处理,并用各自的子类来实现其方法。
可见与工厂方法的区别就是,我们在工厂之上加了一层工厂,将创建工厂细节进行隐藏。往各个工厂下的逻辑与工厂方法模式是一致的。
抽象工厂在多个工厂且这些工厂创建的对象有某种意义上的联系时,用抽象工厂模式有便利于创作者。
其内部的开发者也便于增添删减内容,且有条有序。
main.java

测试样例

package AbstractFactoryPattern;

public class main {
    private static AbstractFactory topFactory;
    private static AbstractFactory bottomFactory;
    public static void main(String[] args) {
        //初始化工厂
        topFactory=new TopDressFactory();
        bottomFactory=new BottomDressFactory();
        //进行生产
        product("T恤","裙子");
        product("大衣","牛仔裤");
    }
    //生产
    public static void product(String top,String bottom){
        TopDress topDress=topFactory.getTopDress(top);
        BottomDress bottomDress=bottomFactory.getBottomDress(bottom);
        topDress.name();
        bottomDress.name();
        System.out.println("------------");
    }
}

运行结果:
T恤
裙子

大衣
牛仔裤

AbstractFactory.java

超级抽象工厂

package AbstractFactoryPattern;

public abstract class AbstractFactory {
    abstract TopDress getTopDress(String type);
    abstract BottomDress getBottomDress(String type);
}

BottomDress.java

下衣接口

package AbstractFactoryPattern;

public interface BottomDress {
    public void name();
}

TopDress.java

上衣接口

package AbstractFactoryPattern;

public interface TopDress {
    public void name();
}

BottomDressFactory.java

下衣工厂

package AbstractFactoryPattern;

public class BottomDressFactory extends AbstractFactory{
    @Override
    TopDress getTopDress(String type) {
        return null;
    }

    @Override
    BottomDress getBottomDress(String type) {
        BottomDress back=null;
        if(type.equals("裙子")){
            back=new Skirt();
        }else if(type.equals("牛仔裤")){
            back=new Jeans();
        }
        return back;
    }
}

TopDressFactory.java

上衣工厂

package AbstractFactoryPattern;

public class TopDressFactory extends AbstractFactory{
    @Override
    TopDress getTopDress(String type) {
        TopDress back=null;
        if(type.equals("大衣")){
            back=new Overcoat();
        }else if(type.equals("T恤")){
            back=new TShirt();
        }
        return back;
    }

    @Override
    BottomDress getBottomDress(String type) {
        return null;
    }
}

Jeans.java

牛仔裤

package AbstractFactoryPattern;

public class Jeans implements BottomDress{
    @Override
    public void name() {
        System.out.println("牛仔裤");
    }
}

Skirt.java

裙子

package AbstractFactoryPattern;

public class Skirt implements BottomDress{
    @Override
    public void name() {
        System.out.println("裙子");
    }
}

Overcoat.java

大衣

package AbstractFactoryPattern;

public class Overcoat implements TopDress{
    @Override
    public void name() {
        System.out.println("大衣");
    }
}

TShirt.java

T恤

package AbstractFactoryPattern;

public class TShirt implements TopDress{
    @Override
    public void name() {
        System.out.println("T恤");
    }
}

总结

看完上面的内容,可能我们会感叹不就是在多个工厂的时候,为这些工厂再建一个工厂吗。
抽象工厂模式更适合于多个工厂的情况,使用抽象工厂模式更有利于对程序进行管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

高万禄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值