vps 建网站,岚山网站建设报价,营销型网站建设和平台建设,水果网页设计模板图片设计模式#xff08;10#xff09;——创建型模式之抽象工厂 什么是抽象工厂#xff1f;抽象工厂的结构抽象工厂伪代码抽象工厂适合应用场景 什么是抽象工厂#xff1f;
抽象工厂#xff08;Abstract Factory#xff09;是一种创建型设计模式#xff0c;它能创建一系列… 设计模式10——创建型模式之抽象工厂 什么是抽象工厂抽象工厂的结构抽象工厂伪代码抽象工厂适合应用场景 什么是抽象工厂
抽象工厂Abstract Factory是一种创建型设计模式它能创建一系列相关的对象而无需指定其具体类。
抽象工厂的结构 抽象产品Abstract Product为构成系列产品的一组不同但相关的产品声明接口具体产品Concrete Product是抽象产品的多种不同类型实现。所有变体都必须实现响应的抽象产品抽象工厂Abastract Factory接口声明了一组创建各种抽象产品的方法具体工厂Concrete Factory实现抽象工厂的构建方法。每个具体工厂都对应特定产品变体且仅创建此种产品变体客户端Client只需要通过抽象接口调用工厂和产品对象就能与任何具体工厂/产品变体交互
抽象工厂伪代码
假如我们正在开发一款应用程序会用到按钮button和复选框checkbox要支持Windows与Mac两种操作系统。为了提高代码可复用性不想为每种操作系统维护单独的代码我们可以应用抽象工厂模式。将按钮button和复选框checkbox作为抽象产品不同的操作系统实现不同的具体产品并提供配套的具体工厂。应用程序Application作为客户端调用抽象工厂创建不同操作系统下的按钮和复选框。 // 抽象工厂接口声明了一组能返回不同抽象产品的方法。这些产品属于同一个系列
// 且在高层主题或概念上具有相关性。同系列的产品通常能相互搭配使用。系列产
// 品可有多个变体但不同变体的产品不能搭配使用。
interface GUIFactory ismethod createButton():Buttonmethod createCheckbox():Checkbox// 具体工厂可生成属于同一变体的系列产品。工厂会确保其创建的产品能相互搭配
// 使用。具体工厂方法签名会返回一个抽象产品但在方法内部则会对具体产品进
// 行实例化。
class WinFactory implements GUIFactory ismethod createButton():Button isreturn new WinButton()method createCheckbox():Checkbox isreturn new WinCheckbox()// 每个具体工厂中都会包含一个相应的产品变体。
class MacFactory implements GUIFactory ismethod createButton():Button isreturn new MacButton()method createCheckbox():Checkbox isreturn new MacCheckbox()// 系列产品中的特定产品必须有一个基础接口。所有产品变体都必须实现这个接口。
interface Button ismethod paint()// 具体产品由相应的具体工厂创建。
class WinButton implements Button ismethod paint() is// 根据 Windows 样式渲染按钮。class MacButton implements Button ismethod paint() is// 根据 macOS 样式渲染按钮// 这是另一个产品的基础接口。所有产品都可以互动但是只有相同具体变体的产
// 品之间才能够正确地进行交互。
interface Checkbox ismethod paint()class WinCheckbox implements Checkbox ismethod paint() is// 根据 Windows 样式渲染复选框。class MacCheckbox implements Checkbox ismethod paint() is// 根据 macOS 样式渲染复选框。// 客户端代码仅通过抽象类型GUIFactory、Button 和 Checkbox使用工厂
// 和产品。这让你无需修改任何工厂或产品子类就能将其传递给客户端代码。
class Application isprivate field factory: GUIFactoryprivate field button: Buttonconstructor Application(factory: GUIFactory) isthis.factory factorymethod createUI() isthis.button factory.createButton()method paint() isbutton.paint()// 程序会根据当前配置或环境设定选择工厂类型并在运行时创建工厂通常在初
// 始化阶段。
class ApplicationConfigurator ismethod main() isconfig readApplicationConfigFile()if (config.OS Windows) thenfactory new WinFactory()else if (config.OS Mac) thenfactory new MacFactory()elsethrow new Exception(错误未知的操作系统。)Application app new Application(factory)抽象工厂适合应用场景 如果代码需要与多个不同系列的相关产品交互 但是由于无法提前获取相关信息 或者出于对未来扩展性的考虑 你不希望代码基于产品的具体类进行构建 在这种情况下 你可以使用抽象工厂。 抽象工厂为你提供了一个接口 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象 那么你就不会生成与应用程序已生成的产品类型不一致的产品。 如果你有一个基于一组抽象方法的类 且其主要功能因此变得不明确 那么在这种情况下可以考虑使用抽象工厂模式。 在设计良好的程序中 每个类仅负责一件事。 如果一个类与多种类型产品交互 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。