【JAVA长虹键法】第四式 普通工厂模式(23种设计模式)

举报
桃花键神 发表于 2022/04/17 12:21:40 2022/04/17
【摘要】 【JAVA长虹键法】第四式 普通工厂模式(23种设计模式)

🔎这里是JAVA长虹键法,关注我学习JAVA不迷路
👍如果对你有帮助,给博主一个免费的点赞以示鼓励
欢迎各位🔎点赞👍评论收藏⭐️

🗡专栏介绍

【JAVA长虹键法】 主要讲了23种设计模式,本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助!

🗡本期介绍

模式: 普通工厂模式
案例: 一个天外陨石(抽象产品),七剑(产品)
一个铸剑传承(抽象工厂),两个铸剑师(工厂)
男铸剑师负责铸造至阳之剑(长虹剑、青光剑、奔雷剑、旋风剑、雨花剑)
女铸剑师负责铸造至阴之剑(冰魄剑、紫云剑)
@[TOC]
在这里插入图片描述

👀什么是工厂模式

在《【JAVA长虹键法】第三式 简单工厂模式》一期中我们介绍了简单工厂模式,提到了简单工厂模式违背了开闭原则,而“工厂方法模式”是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。

🗡优点

1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
2、灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

🗡缺点

1、类的个数容易过多,增加复杂度
2、增加了系统的抽象性和理解难度
3、抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。

🗡应用场景

1、客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
2、创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
3、客户不关心创建产品的细节,只关心产品的品牌

👀普通工厂的实现

案例的主要角色如下:
抽象工厂(Abstract Factory):铸剑传承
工厂(SimpleFactory):男铸剑师、女铸剑师
抽象产品(Product):天外陨石(铸剑的原材料)
具体产品(ConcreteProduct):长虹剑、青光剑、奔雷剑、旋风剑、雨花剑、冰魄剑、紫云剑

案例:
七剑分阴阳,长虹剑、青光剑、奔雷剑、旋风剑、雨花剑属至阳之剑。
冰魄剑、紫云剑属至阴之剑。
男铸剑师传承了打造至阳之剑的方法,女铸剑师传承了打造至阴之剑的方法。
七侠分别找两位铸剑师打造属于自己的剑

🗡抽象产品、产品

Ss接口(天外陨石):

接口内声明了一个方法

public interface Ss {
    void show();
}

Aa类实现接口Ss(长虹剑):

实现Ss接口

public class Aa implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把长虹剑");

    }
}

Bb类实现接口Ss(冰魄剑):

实现Ss接口

public class Bb implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把冰魄剑");

    }
}

Cc类实现接口Ss(紫云剑):

实现Ss接口

public class Cc implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把紫云剑");
    }
}

Dd类实现接口Ss(雨花剑):

实现Ss接口

public class Dd implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把紫云剑");
    }
}

Ee类实现接口Ss(青光剑):

实现Ss接口

public class Ee implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把紫云剑");
    }
}

Ff类实现接口Ss(奔雷剑):

实现Ss接口

public class Ff implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把紫云剑");
    }
}

Gg类实现接口Ss(旋风剑):

实现Ss接口

public class Gg implements Ss {
    @Override
    public void show() {
        System.out.println("打造了一把紫云剑");
    }
}

🗡抽象工厂、工厂

Zz接口(铸剑传承):

接口内声明了一个铸剑方法abc()

public interface Zz {
    Ss abc(String a);
}

Nan类实现接口Zz(男铸剑师):

实现Zz接口

public class Nan implements Zz {
    private static Ss ss;

    public Ss abc(String a) {
        if ("长虹剑".equals(a)) {
            ss = new Aa();
        } else if ("奔雷剑".equals(a)) {
            ss = new Ff();
        } else if ("青光剑".equals(a)) {
            ss = new Ee();
        } else if ("雨花剑".equals(a)) {
            ss = new Dd();
        } else if ("旋风剑".equals(a)) {
            ss = new Gg();
        } else {
            System.out.println("铸剑失败");
        }
        return ss;
    }
}

Nv类实现接口Zz(女铸剑师):

实现Zz接口

public class Nv implements Zz {
    private static Ss ss;

    public Ss abc(String a) {
        if ("冰魄剑".equals(a)) {
            ss = new Bb();
        } else if ("紫云剑".equals(a)) {
            ss = new Cc();
        } else {
            System.out.println("铸剑失败");
        }
        return ss;
    }
}

🗡测试

测试类:

public class Demo {
    public static void main(String[] args) {
        System.out.println("---------至阳之剑-------------");
        //男铸剑师
        Nan nan = new Nan();
        Ss aa = nan.abc("长虹剑");
        Ss dd = nan.abc("雨花剑");
        Ss ee = nan.abc("青光剑");
        Ss ff = nan.abc("奔雷剑");
        Ss gg = nan.abc("旋风剑");
        aa.show();
        dd.show();
        ee.show();
        ff.show();
        gg.show();
        System.out.println("---------至阴之剑-------------");
        //女铸剑师
        Nv nv = new Nv();
        Ss bb = nv.abc("冰魄剑");
        Ss cc = nv.abc("紫云剑");
        bb.show();
        cc.show();
    }
}

在这里插入图片描述

下期预告

模式: 抽象工厂模式
案例: 七侠师傅和师母为七侠打造七剑和培养小灵鸽
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。