设计模式创建型——抽象工厂模式

目录

什么是抽象工厂模式

抽象工厂模式的实现

工厂方法模式角色

抽象工厂模式类图

抽象工厂模式代码实现

抽象工厂模式的特点

优点

缺点

使用场景

注意事项

实际应用


什么是抽象工厂模式

        抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。

        在介绍抽象工厂模式前,我们先厘清两个概念:

        产品等级结构:产品等级结构指的是产品的继承结构,例如一个汽车抽象类,它有蔚来汽车、特斯拉汽车、比亚迪汽车等一系列的子类,那么这个汽车抽象类和他的子类就构成了一个产品等级结构。产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。比如,比亚迪工厂生产唐、宋,那么唐、宋则位于空调产品族中。

        抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

        但该模式的缺点在于添加新的行为时比较麻烦,如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

抽象工厂模式的实现

工厂方法模式角色

  1. 抽象工厂角色(Abstract Factory):描述具体工厂的公共接口,是具体工厂的父类。
  2. 具体工厂角色(Concrete Factory):描述具体工厂,创建产品的实例,供外界调用,主要实现了抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品角色(Product):抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
  4. 具体产品角色(Concrete Product)具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法,由具体工厂来创建,它同具体工厂之间一一对应。

抽象工厂模式类图

抽象工厂模式代码实现

抽象产品角色

/**
 * @author Evan Walker
 * @version 1.0
 * @desc 昂焱数据: https://www.ayshuju.com
 * @date 2023/04/04 13:41:41
 */
public interface Color {
    String getColor();
}
public interface Taste {
    String getTaste();
}

具体产品角色 

 * @author Evan Walker
 * @version 1.0
 * @desc 昂焱数据: https://www.ayshuju.com
 * @date 2023/04/04 13:42:21
 */
public class Apple implements Color {
    @Override
    public String getColor() {
        return "红色";
    }
}
public class Orange implements Color {
    @Override
    public String getColor() {
        return "橙色";
    }

}
public class Pear implements Color {
    @Override
    public String getColor() {
        return "黄色";
    }
}

public class Coke implements Taste {
    @Override
    public String getTaste() {
        return "好喝打嗝";
    }
}
public class Milk implements Taste {
    @Override
    public String getTaste() {
        return "香";
    }
}
public class Wine implements Taste {
    @Override
    public String getTaste() {
        return "好喝上头";
    }
}

抽象工厂角色

/**
 * @author Evan Walker
 * @version 1.0
 * @desc 昂焱数据: https://www.ayshuju.com
 * @date 2023/04/06 13:58:37
 */
public abstract class AbstractFactory {

    public abstract Color getColor(String name);

    public abstract Taste getTaste(String name);

}

具体工厂角色

/**
 * @author Evan Walker
 * @version 1.0
 * @desc 昂焱数据: https://www.ayshuju.com
 * @date 2023/04/06 14:44:44
 */
public class ColorFactory extends AbstractFactory {

    @Override
    public Color getColor(String name) {
        if(name == null){
            return null;
        }
        if(name.equalsIgnoreCase("APPLE")){
            return new Apple();
        } else if(name.equalsIgnoreCase("ORANGE")){
            return new Orange();
        } else if(name.equalsIgnoreCase("PEAR")){
            return new Pear();
        }
        return null;
    }

    @Override
    public Taste getTaste(String taste) {
        return null;
    }
}
public class TasteFactory extends AbstractFactory {

    @Override
    public Color getColor(String name) {
        return null;
    }

    @Override
    public Taste getTaste(String name) {
        if(name == null){
            return null;
        }
        if(name.equalsIgnoreCase("MILK")){
            return new Milk();
        } else if(name.equalsIgnoreCase("WINE")){
            return new Wine();
        } else if(name.equalsIgnoreCase("COKE")){
            return new Coke();
        }
        return null;
    }
}

创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂,并进行测试。

/**
 * @author Evan Walker
 * @version 1.0
 * @desc 昂焱数据: https://www.ayshuju.com
 * @date 2023/04/06 15:45:51
 */
public class FactoryProducer {
    public static AbstractFactory getFactory(String choice){
        if(choice.equalsIgnoreCase("TASTE")){
            return new TasteFactory();
        } else if(choice.equalsIgnoreCase("COLOR")){
            return new ColorFactory();
        }
        return null;
    }
}
/**
 * @author Evan Walker
 * @version 1.0
 * @desc
 * @date 2023/04/04 14:02:43
 */
public class Test {

    public static void main(String[] args) {

        //获取味道工厂
        AbstractFactory tasteFactory = FactoryProducer.getFactory("Taste");
        Taste taste = tasteFactory.getTaste("Wine");
        System.out.println(taste.getTaste());
        taste= tasteFactory.getTaste("milk");
        System.out.println(taste.getTaste());
        taste= tasteFactory.getTaste("COKE");
        System.out.println(taste.getTaste());

        //获取颜色工厂
        AbstractFactory colorFactory = FactoryProducer.getFactory("Color");
        Color color = colorFactory.getColor("apple");
        color.getColor();
        System.out.println(color.getColor());
        color = colorFactory.getColor("orange");
        System.out.println(color.getColor());
        color = colorFactory.getColor("pear");
        System.out.println(color.getColor());

    }
}

抽象工厂模式的特点

优点

  1. 提供了一种封装对象创建过程的方式:抽象工厂模式将对象的创建过程封装在了具体的工厂类中,客户端只需要关注工厂接口和产品接口,无需关心具体的实现细节。
  2. 实现了产品族的切换:通过使用不同的具体工厂类,可以方便地切换整个产品族的产品,从而实现了接口与实现的分离。
  3. 保持了代码的一致性:抽象工厂模式保持了一致性,即所有由同一工厂创建的产品都相互关联,使得产品之间可以很方便地进行配合使用。
     

缺点

  1. 不易扩展新的产品:当需要给产品家族新增一个产品时,需要修改抽象工厂的接口及所有的具体工厂类,这就违反了开闭原则,增加了代码的维护成本。
  2. 增加了系统的复杂度:抽象工厂模式引入了多个抽象和具体类,增加了系统的复杂度和理解难度。

使用场景

  1. 必须创建一系列相互关联或相互依赖的产品对象。
  2. 需要提供一个统一的接口,将客户端与具体实现解耦。
  3. 需要在运行时切换不同的产品族。

注意事项

  1. 注意抽象工厂接口的设计,应该根据业务需求合理定义所需方法。
  2. 了解产品族和产品等级结构之间的关系,避免设计出不符合实际需求的工厂类结构。

实际应用

  1. GUI工具包:不同的操作系统(如Windows、Linux)提供了不同的GUI工具包,抽象工厂模式可以用于创建具体的按钮、文本框等GUI组件。
  2. 数据库访问:数据库访问框架可以根据配置文件或运行时参数选择不同的数据库访问驱动,抽象工厂模式可以用于创建不同类型的数据库连接和操作对象。
  3. 游戏开发:在游戏开发中,可以使用抽象工厂模式来创建不同种类的角色、武器、装备等物品。

更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
书籍目录 目录 第1章基本概念 1 1.1什么是设计模式 2 1.2设计模式的作用 3 1.3GRASP模式的分类 4 1.4GoF设计模式的分类 4 1.5模式的学习阶段 6 第2章负责任地设计对象——GRASP 9 2.1InformationExpert(信息专家) 11 2.2Creator(创造者) 13 2.3LowCoupling(低耦合) 14 2.4HighCohesion(高内聚) 15 2.5Controller(控制器) 17 2.6Polymorphism(多态) 18 2.7PureFabrication(纯虚构) 19 2.8Indirection(间接) 20 2.9ProtectedVariations(受保护变化) 21 第3章GoF-CreationalDesignPatterns创建设计模式 23 3.1SimpleFactoryPattern(简单工厂模式) 24 3.1.1定义 24 3.1.2现实例子——国旗生产厂 26 3.1.3C#实例1——电子付款系统 26 3.1.4C#实例2——学校登录系统 29 3.1.5Java实例——手机简单工厂 32 3.1.6优势和缺陷 34 3.1.7应用情景 34 3.2FactoryMethodPattern(工厂方法模式) 35 3.2.1定义 35 3.2.2现实例子——兵工厂 36 3.2.3C#实例——多文档系统 37 3.2.4Java实例——扩展了的手机工厂 41 3.2.5优势和缺陷 44 3.2.6应用情景 44 3.3AbstractFactoryPattern(抽象工厂模式) 45 3.3.1定义 45 3.3.2现实例子——扩展了的兵工厂 48 3.3.3C#实例——大陆生态系统 49 3.3.4Java实例——电脑产品 52 3.3.5优势和缺陷 57 3.3.6应用情景 57 3.4BuilderPattern(建造者模式) 58 3.4.1定义 58 3.4.2现实例子——快餐店 60 3.4.3C#实例——车间造车 61 3.4.4Java实例——建造房屋 65 3.4.5优势和缺陷 69 3.4.6应用情景 70 3.5PrototypePattern(原模式) 70 3.5.1定义 70 3.5.2现实中的拷贝-粘贴 71 3.5.3C#实例——颜色管理器 72 3.5.4Java实例——简单ToolBar 74 3.5.5ShallowCopy与DeepCopy 76 3.5.6优势和缺陷 82 3.5.7应用情景 82 3.6SingletonPattern(单例模式) 82 3.6.1定义 82 3.6.2现?抵械牡ダ??猈indowsTaskManager 83 3.6.3C#实例——负载均衡控制器 84 3.6.4Java实例——系统日志 86 3.6.5DoubleCheckLocking(双检锁) 89 3.6.6优势和缺陷 93 3.6.7应用情景 93 第4章GoF-StructuralDesignPatterns结构设计模式 95 4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 102 4.1.5优势和缺陷 104 4.1.6应用情景 104 4.2BridgePattern(桥接模式) 104 4.2.1定义 104 4.2.2现实中的实例——男人的约会 106 4.2.3C#实例——商业对象与数据对象 107 4.2.4Java实例——不同系统的图像处理 112 4.2.5优势和缺陷 114 4.2.6应用情景 115 4.3CompositePattern(组合模式) 115 4.3.1定义 115 4.3.2组合模式的现实应用——资源管理器 117 4.3.3C#实例——图形树状对象结构 118 4.3.4Java实例——文档格式化 121 4.3.5优势和缺陷 124 4.3.6应用情景 125 4.4DecoratorPattern(装饰模式) 125 4.4.1定义 125 4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2现实中的实例——顾客服务员 135 4.5.3C#实例——抵押申请审核 136 4.5.4Java实例——冲茶 139 4.5.5优势和缺陷 143 4.5.6应用情景 143 4.6FlyweightPattern(轻量级模式) 144 4.6.1定义 144 4.6.2实例——中游的四国军棋 146 4.6.3C#实例——文档编辑器 147 4.6.4Java实例——装载图像 151 4.6.5优势和缺陷 154 4.6.6应用情景 154 4.7ProxyPattern(代理模式) 154 4.7.1定义 154 4.7.2几个现实中的实例 156 4.7.3C#实例——数学代理 158 4.7.4Java实例——Socket回声 160 4.7.5优势和缺陷 165 4.7.6应用情景 165 第5章GoF-BehavioralDesignPatterns行为设计模式 167 5.1ChainofResponsibility(责任链模式) 168 5.1.1定义 168 5.1.2现实中的实例——军情的传递 169 5.1.3C#实例——采购分级审批 170 5.1.4Java实例——智能大厦安全系统 174 5.1.5优势和缺陷 178 5.1.6应用情景 178 5.2CommandPattern(命令模式) 179 5.2.1定义 179 5.2.2现实中的实例——餐馆订菜 180 5.2.3C#实例——简单计算器 181 5.2.4Java实例——总开关 185 5.2.5优势和缺陷 189 5.2.6应用情景 189 5.3InterpreterPattern(解释器模式) 190 5.3.1定义 190 5.3.2现实示例——音乐符号 192 5.3.3C#实例——中国金钱大写转换 192 5.3.4Java实例——自定义程序解释器 197 5.3.5优势和缺陷 204 5.3.6应用情景 205 5.4IteratorPattern(迭代器模式) 205 5.4.1定义 205 5.4.2现实示例——电视节目选择器 206 5.4.3C#实例——遍历例子 207 5.4.4Java实例——两个迭代器 211 5.4.5优势和缺陷 213 5.4.6应用情景 214 5.5MediatorPattern(中介者模式) 214 5.5.1定义 214 5.5.2现实示例——机场控制塔 215 5.5.3C#实例——聊天室 216 5.5.4Java实例——多线程通信 220 5.5.5优势和缺陷 223 5.5.6应用情景 223 5.6MementoPattern(备忘录模式) 223 5.6.1定义 223 5.6.2现实示例——音响均衡器 226 5.6.3C#实例——销售目标 226 5.6.4Java实例——多次Undo(取消)操作 231 5.6.5优势和缺陷 236 5.6.6应用情景 236 5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 5.7.7应用情景 248 5.8StatePattern(状态模式) 248 5.8.1定义 248 5.8.2现实例子——心情好坏 250 5.8.3C#实例——账户分类 250 5.8.4Java实例——汽车的变速档 258 5.8.5优势和缺陷 261 5.8.6应用情景 261 5.9StrategyPattern(策略模式) 261 5.9.1定义 261 5.9.2现实例子——去机场的策略 263 5.9.3C#实例——排序方法 263 5.9.4Java实例——多格式输出 266 5.9.5优势和缺陷 272 5.9.6应用情景 272 5.10TemplateMethodPattern(模板方法模式) 272 5.10.1定义 272 5.10.2现实例子——厨师烹调 274 5.10.3C#实例——数据库连接模板 274 5.10.4Java实例——冒泡排序模板 277 5.10.5优势和缺陷 280 5.10.6应用情景 280 5.11VisitorPattern(访问者模式) 280 5.11.1定义 280 5.11.2现实例子——收银员收银计费 282 5.11.3C#实例——人事评估 283 5.11.4Java实例——维修工程师检查车辆 287 5.11.5优势和缺陷 291 5.11.6应用情??291 第6章模式的综合应用 293 6.1Java实例——扩展的日志记录器 294 6.2C#实例——存储分析器 298 6.3用模式生成程序架构 316 附录1自测题 321 附录2自测题答案 331 参考文献 337

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值