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

手机网站功能分析WordPress切换经典编辑器

手机网站功能分析,WordPress切换经典编辑器,太原网站建设质量推荐,凡科网商城充值文章目录一、概念二、实例分析三、完整示例一、概念 抽象工厂模式是一种创建型设计模式。 提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。 相比于工厂方法模式,抽象工厂模式不仅仅是创建单一产品,而是一族产品&am…

文章目录

    • 一、概念
    • 二、实例分析
    • 三、完整示例

一、概念

  抽象工厂模式是一种创建型设计模式。 提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。
相比于工厂方法模式,抽象工厂模式不仅仅是创建单一产品,而是一族产品(产品族)。
在这里插入图片描述
抽象工厂模式结构:
在这里插入图片描述

二、实例分析

问题:
假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示:

  1. 一系列相关产品, 例如椅子Chair 、 ​ 沙发Sofa和咖啡桌Coffee­Table 。
  2. 系列产品的不同变体。 例如, 你可以使用现代Modern 、 ​ 维多利亚Victorian 、 ​ 装饰风艺术Art­Deco等风格生成 椅子 、沙发和 咖啡桌 。

在这里插入图片描述
你需要设法单独生成每件家具对象, 这样才能确保其风格一致。 如果顾客收到的家具风格不一样, 他们可不会开心。

在这里插入图片描述
此外, 你也不希望在添加新产品或新风格时修改已有代码。 家具供应商对于产品目录的更新非常频繁, 你不会想在每次更新时都去修改核心代码的。

解决方案:
首先, 抽象工厂模式建议为系列中的每件产品明确声明接口 (例如椅子、 沙发或咖啡桌)。 然后, 确保所有产品变体都继承这些接口。 例如, 所有风格的椅子都实现椅子接口; 所有风格的咖啡桌都实现咖啡桌接口, 以此类推。
在这里插入图片描述
接下来, 我们需要声明抽象工厂——包含系列中所有产品构造方法的接口。 例如 create­Chair创建椅子 、 ​ create­Sofa创建沙发和 create­Coffee­Table创建咖啡桌 。 这些方法必须返回抽象产品类型, 即我们之前抽取的那些接口: ​ 椅子 , ​ 沙发和 咖啡桌等等。

那么该如何处理产品变体呢? 对于系列产品的每个变体, 我们都将基于 抽象工厂接口创建不同的工厂类。 每个工厂类都只能返回特定类别的产品, 例如, ​ 现代家具工厂Modern­Furniture­Factory只能创建 现代椅子Modern­Chair 、 ​ 现代沙发Modern­Sofa和 现代咖啡桌Modern­Coffee­Table对象。

客户端代码可以通过相应的抽象接口调用工厂和产品类。 你无需修改实际客户端代码, 就能更改传递给客户端的工厂类, 也能更改客户端代码接收的产品变体。

在这里插入图片描述
设客户端想要工厂创建一把椅子。 客户端无需了解工厂类, 也不用管工厂类创建出的椅子类型。 无论是现代风格, 还是维多利亚风格的椅子, 对于客户端来说没有分别, 它只需调用抽象 椅子接口就可以了。 这样一来, 客户端只需知道椅子以某种方式实现了 sit­On坐下方法就足够了。 此外, 无论工厂返回的是何种椅子变体, 它都会和由同一工厂对象创建的沙发或咖啡桌风格一致。

最后一点说明: 如果客户端仅接触抽象接口, 那么谁来创建实际的工厂对象呢? 一般情况下, 应用程序会在初始化阶段创建具体工厂对象。 而在此之前, 应用程序必须根据配置文件或环境设定选择工厂类别。

代码示例:
抽象产品接口

#include <iostream>
#include <memory>
using namespace std;// 椅子
class Chair {
public:virtual void sitOn() = 0;virtual ~Chair() = default;
};// 沙发
class Sofa {
public:virtual void lieOn() = 0;virtual ~Sofa() = default;
};// 咖啡桌
class CoffeeTable {
public:virtual void putCoffee() = 0;virtual ~CoffeeTable() = default;
};

具体产品实现

// ---------- Art Deco 风格 ----------
class ArtDecoChair : public Chair {
public:void sitOn() override { cout << "坐在 Art Deco 椅子上\n"; }
};class ArtDecoSofa : public Sofa {
public:void lieOn() override { cout << "躺在 Art Deco 沙发上\n"; }
};class ArtDecoCoffeeTable : public CoffeeTable {
public:void putCoffee() override { cout << "在 Art Deco 咖啡桌上放咖啡\n"; }
};// ---------- Victorian 风格 ----------
class VictorianChair : public Chair {
public:void sitOn() override { cout << "坐在 Victorian 椅子上\n"; }
};class VictorianSofa : public Sofa {
public:void lieOn() override { cout << "躺在 Victorian 沙发上\n"; }
};class VictorianCoffeeTable : public CoffeeTable {
public:void putCoffee() override { cout << "在 Victorian 咖啡桌上放咖啡\n"; }
};// ---------- Modern 风格 ----------
class ModernChair : public Chair {
public:void sitOn() override { cout << "坐在 Modern 椅子上\n"; }
};class ModernSofa : public Sofa {
public:void lieOn() override { cout << "躺在 Modern 沙发上\n"; }
};class ModernCoffeeTable : public CoffeeTable {
public:void putCoffee() override { cout << "在 Modern 咖啡桌上放咖啡\n"; }
};

抽象工厂接口

class FurnitureFactory {
public:virtual Chair* createChair() = 0;virtual Sofa* createSofa() = 0;virtual CoffeeTable* createCoffeeTable() = 0;virtual ~FurnitureFactory() = default;
};

具体工厂实现

class ArtDecoFactory : public FurnitureFactory {
public:Chair* createChair() override { return new ArtDecoChair(); }Sofa* createSofa() override { return new ArtDecoSofa(); }CoffeeTable* createCoffeeTable() override { return new ArtDecoCoffeeTable(); }
};class VictorianFactory : public FurnitureFactory {
public:Chair* createChair() override { return new VictorianChair(); }Sofa* createSofa() override { return new VictorianSofa(); }CoffeeTable* createCoffeeTable() override { return new VictorianCoffeeTable(); }
};class ModernFactory : public FurnitureFactory {
public:Chair* createChair() override { return new ModernChair(); }Sofa* createSofa() override { return new ModernSofa(); }CoffeeTable* createCoffeeTable() override { return new ModernCoffeeTable(); }
};

客户端使用

void clientCode(FurnitureFactory* factory) {unique_ptr<Chair> chair(factory->createChair());unique_ptr<Sofa> sofa(factory->createSofa());unique_ptr<CoffeeTable> table(factory->createCoffeeTable());chair->sitOn();sofa->lieOn();table->putCoffee();
}int main() {FurnitureFactory* factory = nullptr;cout << "=== 使用 Art Deco 风格 ===\n";factory = new ArtDecoFactory();clientCode(factory);delete factory;cout << "\n=== 使用 Victorian 风格 ===\n";factory = new VictorianFactory();clientCode(factory);delete factory;cout << "\n=== 使用 Modern 风格 ===\n";factory = new ModernFactory();clientCode(factory);delete factory;return 0;
}

三、完整示例

比如我们要实现一个跨平台的 UI 库,有两种风格:Windows 风格和 Mac 风格,每种风格都包含:

  • 按钮(Button)
  • 文本框(TextBox)

抽象产品

// 抽象按钮
class Button {
public:virtual void paint() = 0;virtual ~Button() = default;
};// 抽象文本框
class TextBox {
public:virtual void show() = 0;virtual ~TextBox() = default;
};

具体产品

// Windows 按钮
class WinButton : public Button {
public:void paint() override { qDebug("Draw Windows Button"); }
};// Windows 文本框
class WinTextBox : public TextBox {
public:void show() override { qDebug("Show Windows TextBox"); }
};// Mac 按钮
class MacButton : public Button {
public:void paint() override { qDebug("Draw Mac Button"); }
};// Mac 文本框
class MacTextBox : public TextBox {
public:void show() override { qDebug("Show Mac TextBox"); }
};

抽象工厂

class GUIFactory {
public:virtual Button* createButton() = 0;virtual TextBox* createTextBox() = 0;virtual ~GUIFactory() = default;
};

具体工厂

class WinFactory : public GUIFactory {
public:Button* createButton() override { return new WinButton(); }TextBox* createTextBox() override { return new WinTextBox(); }
};class MacFactory : public GUIFactory {
public:Button* createButton() override { return new MacButton(); }TextBox* createTextBox() override { return new MacTextBox(); }
};

客户端使用

void clientCode(GUIFactory* factory) {Button* btn = factory->createButton();TextBox* txt = factory->createTextBox();btn->paint();txt->show();delete btn;delete txt;
}int main() {GUIFactory* factory = new WinFactory();clientCode(factory);delete factory;factory = new MacFactory();clientCode(factory);delete factory;return 0;
}
http://www.dtcms.com/a/600252.html

相关文章:

  • 电脑网站加速器网站种类有哪些
  • 做网站属于什么行业网络优化的内容包括哪些方面
  • 德宏企业网站建设公司6广告策划活动公司
  • 购物类网站都有哪些模块最近发生的新闻
  • 设计网站官网狗网络推广和seo
  • 莱州市网站市场监督管理局举报电话
  • 湛江住房和城乡建设部网站wordpress新闻门户
  • 吉林省建设监理检测网站中国新闻社是国企还是央企
  • 米粒网站建设与推广专家做淘宝客网站要备案吗
  • 做国外衣服的网站有哪些互联科技 行业网站
  • 国外模板网站松江做网站价格
  • 亳州市网站建设公司wordpress个人博客主题
  • 哈尔滨网站建设设计eyoucms去版权
  • 昆明网站设计公司哪家好开发一个婚恋app需要多少钱
  • 个人博客建站wordpress免费正能量励志网站
  • 标准化班组建设网站邯郸信息港发布信息
  • 华美天一建筑公司网站长期网站外包
  • 东莞网站推广公司黄页开发外包公司有哪些?哪个比较好
  • 在东莞做网站淘宝关键词搜索
  • 北京网站设计济南兴田德润评价巩义网站建设托管
  • 自己做团购网站怎么样快速收录提交入口
  • 淄博网站建设 百度知道建设网站费用计入什么费用
  • 建立网站大约多少钱wordpress 拍卖 主题
  • 宜兴市做网站广州住房和城乡建设局网站
  • 易语言如何做网站吗精品课程网站建设论文
  • 洛阳哪里做网站app哪个网站开发好
  • wordpress迁移跳转原网站WordPress目录和连接关系
  • 怎样上网站dns解析不了在线磁力搜索神器
  • 网站建设文章官网设计网站特点
  • 海建网站首钢建设集团山东公司网站