当前位置: 首页 > news >正文

设计模式 之 —— 抽象工厂模式

目录

什么是抽象工厂模式?

定义

特点

抽象工厂模式(java代码示例)

首先定义第一个接口 

实现第一个接口的类

定义第二个接口

实现第二个接口的类

 * 创建抽象工厂类

创建扩展了 AbstractFactory 的工厂类

        饮料工厂

        食物工厂

 * 创建一个工厂生成器类

测试类:

运行结果:

抽象工厂模式的优缺点

优点:

缺点:

总结:


什么是抽象工厂模式?

定义

抽象工厂模式(Abstract Factory Pattern),它围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。它也是一种创建型设计模式,提供了一种创建对象的最佳方式。

特点

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体实现类。通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

抽象工厂模式(java代码示例)

首先定义第一个接口 

(饮料:Drinks)

public interface Drinks {void product();
}

实现第一个接口的类

(类:茶、可乐、矿泉水)

public class Tea implements Drinks {@Overridepublic void product(){System.out.println("饮料——茶");}
}
public class Cola implements Drinks {@Overridepublic void product(){System.out.println("饮料——可乐");}
}
public class MineralWater implements Drinks {@Overridepublic void product(){System.out.println("饮料——矿泉水");}
}

定义第二个接口

(食物:Foods)

public interface Foods {void product();
}

实现第二个接口的类

public class Chicken implements Foods {@Overridepublic void product(){System.out.println("食物——鸡肉");}
}
public class Beaf implements Foods {@Overridepublic void product(){System.out.println("食物——牛肉");}
}
public class Fish implements Foods {@Overridepublic void product(){System.out.println("食物——鱼肉");}
}

.......................................

                ( 相似地,可以继续定义n个接口,然后用类实现这些接口。)

 * 创建抽象工厂类

public abstract class AbstractFactory {public abstract Drinks getDrinks(String drinks);public abstract Foods getFoods(String foods);//上边创建了多少被实现的接口,这里就可以创建多少个方法
}

                (上边创建了多少被实现的接口,这里就可以创建多少个方法)

创建扩展了 AbstractFactory 的工厂类

(基于给定的信息生成实体类的对象)

        饮料工厂
public class DrinksFactory extends AbstractFactory {@Overridepublic Drinks newDrinks(String DrinksType){if(DrinksType.equals(("茶"))){return new Tea();}else if(DrinksType.equals("可乐")){return new Cola();}else if(DrinksType.equals("矿泉水")){return new MineralWater();}else {System.out.println("暂时没有这种饮料");return null;}}@Overridepublic Foods newFoods(String FoodsType){return null;}
}
        食物工厂
public class FoodsFactory extends AbstractFactory {@Overridepublic Drinks newDrinks(String DrinksType){return null;}@Overridepublic Foods newFoods(String FoodsType){if(FoodsType.equals(("鸡肉"))){return new Chicken();}else if(FoodsType.equals("鱼肉")){return new Fish();}else if(FoodsType.equals("牛肉")){return new Beaf();}else {System.out.println("暂时没有这种食物");return null;}}
}

          (这里麻烦的是,每一个具体的工厂,没有办法只重载自己所需要的方法,都需要将 AbstractFactory 中所有的方法@Override。否则会报错,这是抽象工厂模式的缺点之一。)

 * 创建一个工厂生成器类

(通过传递 “选择” 信息来获取工厂)

public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase("食物")){return new FoodsFactory();} else if(choice.equalsIgnoreCase("饮料")){return new DrinksFactory();}else {System.out.println("暂时没有该工厂");return null;}}
}

测试类:

public class Test {public static void main(String[] args) {AbstractFactory foodsFactory = FactoryProducer.getFactory("食物");AbstractFactory foodsFactory2 = FactoryProducer.getFactory("饮料");AbstractFactory foodsFactory3 = FactoryProducer.getFactory("衣服");Foods foods = foodsFactory.newFoods("鱼肉");foods.product();Foods foods2 = foodsFactory.newFoods("鸡肉");foods2.product();Foods foods3 = foodsFactory.newFoods("牛肉");foods3.product();Foods foods4 = foodsFactory.newFoods("猪肉");Drinks drinks = foodsFactory2.newDrinks("可乐");drinks.product();Drinks drinks2 = foodsFactory2.newDrinks("矿泉水");drinks.product();Drinks drinks3 = foodsFactory2.newDrinks("茶");drinks.product();Drinks drinks4 = foodsFactory2.newDrinks("啤酒");}
}
运行结果:

抽象工厂模式的优缺点

优点:

客户端独立于具体的实现类:客户端使用抽象工厂来创建产品,而不需要关心具体的实现类。这样可以降低客户端与具体实现类之间的耦合度。

易于切换产品系列:由于客户端只使用抽象工厂来创建产品,所以只需要切换具体的工厂实现类,就可以切换到不同的产品系列。

确保产品组合的一致性:每个具体工厂负责创建一个产品系列,这确保了产品之间的一致性。

支持产品等级结构:抽象工厂模式提供了一种支持产品等级结构的方式,可以很容易地增加新的产品。

缺点:

难以支持新种类的产品:如果需要添加一个新种类的产品,则需要修改抽象工厂接口以及所有的具体工厂实现。 (上述java代码 “ 创建扩展了 AbstractFactory 的工厂类 ” 中@Override)
由于引入了抽象层,增加了系统的抽象性和理解难度。对于不熟悉该模式的开发人员来说,理解工厂方法的作用和应用场景可能会有一些困难。

总结:

抽象工厂模式与工厂模式都使客户端使用抽象工厂来创建产品,而不需要关心具体的实现类。

抽象工厂模式可以很容易的增加某个种类里的新产品,但是增加新种类有些许困难(举例:在“饮料”中增加新饮品“雪碧”很简单,但在“工厂”中增加新的“甜品工厂”难)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++生化危机1.5源码
  • C# Unity 面向对象补全计划 之 初识继承方法与多态
  • CC++内存魔术:掌控无形资源
  • 知识见闻 - 什么样的人值得结交
  • Prometheus 监控 Nginx
  • 【C++高阶】:C++11的深度解析下
  • Redis结合Lua脚本的简单使用
  • 使用MySQLdump定时备份数据库实战
  • [Kimi笔记]C# 中,public、private 和 internal 访问修饰符
  • H5+JS 4096小游戏
  • 从零入门CV图像竞赛(2024全球Deepfake攻防挑战赛)
  • Java基础:反射
  • 笑谈“八股文”,人生不成文
  • 【Kubernetes】k8s集群的资源发布方式
  • LSPatch制作内置模块应用软件无需root 教你制作内置应用
  • Google 是如何开发 Web 框架的
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【comparator, comparable】小总结
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java 最常见的 200+ 面试题:面试必备
  • Java方法详解
  • js算法-归并排序(merge_sort)
  • Odoo domain写法及运用
  • Python 基础起步 (十) 什么叫函数?
  • Sublime text 3 3103 注册码
  • Webpack 4 学习01(基础配置)
  • win10下安装mysql5.7
  • 产品三维模型在线预览
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 用element的upload组件实现多图片上传和压缩
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #{}和${}的区别?
  • (03)光刻——半导体电路的绘制
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (C#)获取字符编码的类
  • (c语言+数据结构链表)项目:贪吃蛇
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (强烈推荐)移动端音视频从零到上手(下)
  • (原創) 物件導向與老子思想 (OO)
  • (转)ABI是什么
  • (转)VC++中ondraw在什么时候调用的
  • (自用)交互协议设计——protobuf序列化
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net6+aspose.words导出word并转pdf
  • .NET开源快速、强大、免费的电子表格组件
  • .NET中两种OCR方式对比