原版创建型模式

创建型模式的特点与应用

        创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。

        随着系统演化得越来越依赖于对象复合而不是类继承,创建型模式变得更为重要。当这种情况发生时,重心从一组固定行为得硬编码转移到定义一个较小的基本行为集,这些行为可以被组合成任意数目的更复杂的行为。这样创建有特定行为的对象要求的不仅仅是实例化一个类。

        在这些模式中有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些具体的类的信息封装起来。第二,它们隐藏了这些类的实例是如何创建和放在一起的。整个系统关于这些对象所知道的是由抽象类所定义的接口。因此,创建型模式在什么被创建,谁创建它,它是怎样创建的,以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的产品对象配置一个系统。配置可以是静态的,也可以是动态的。

        有时创建型模式是相互竞争的。例如,在有些情况下Prototype或AbsTract Factory用起来都很好。而在另外一些它们是互补的:Builder可以使用其他模式去实现某个构件的创建。Prototype可以在它的实现中使用SingleTon。

        因为创建型模式紧密相关,将所有5个模式一起研究突出它们相似点和差异点。我们也将举一个通用的例子,为一个电脑游戏创建一个迷宫来说明它们的实现。这个迷宫和游戏将随着各种模式不同略有区别。有时这个游戏仅仅找个一个迷宫的出口;在这种情况下,游戏将随着各种模式不同而略由区别。有时这个游戏将仅仅是找到一个迷宫的出口;在这种情况下,游戏者可能仅仅能见到该迷宫的局部。有时迷宫包括一些要解决的问题和要战胜的危险,并且这些游戏可能会提供已经被探索过的那部分迷宫地图。

        我们将忽略许多迷宫中的细节以及一个迷宫游戏中有一个还是多个游戏者。我们仅仅关注迷宫是怎么被创建的。我们将一个迷宫定义为一系列房间。一个房间知道它的邻居;可能的邻居要不是另一个房间,要不是一堵墙,或者是到另一个房间的一扇门。

        类Room,Door和Wall定义了我们所有的例子中使用到的构件。我们仅仅定义这些这些类中对创建一个迷宫起重要作用的一些部分。我们将忽略游戏者、显示操作和在迷宫中四处移动操作,以及其他一些重要的却与迷宫创建无关的功能。

        每个房间有四面,我们使用C++中的枚举类型Direction来指定房间的东南西北:

enum Direction {North, South, East, West};

SmallTalk的实现使用相应的符号来表示这些方向。

        类MapSite是所有迷宫组件的公共抽象类。为了简化例子,MapSite仅仅定义了一个操作Enter,它的含义是决定于你在进入什么。如果你进入一个房间,那么你的位置会发生改变。如果你试图进入一扇门,那么这两件事情中就有一件会发生:如果门是开着的,你进入另一个房间。如果门是关着的,那么你就会碰壁。

class MapSite{

public:

        virtual void Enter() = 0;

};

Enter为更加复杂的游戏操作提供了一个简单基础。例如,如果你在一个房间中说:“向东走”,游戏只能确定直接在东边的是哪一个MapSite并对它调用Enter。特定子类的Enter操作将计算出你的位置是发生改变,还是你会碰壁。在一个真正的游戏中,Enter可以将移动的游戏者对象作为一个参数。

  • Room

Room是MapSite的一个具体子类,而MapSite定义了迷宫中构件之间的主要关系。Room有指向其他MapSite对象的引用,并保存一个房间号,这个数字用来标识迷宫中的房间。

class Room: public MapSite {

public:

        Room(int roomNo);

        MapSite* GetSide(Direction) const;

        void SetSide(Direction, MapSite*);

        virtual void Enter();

private:

        MapSite* _sides[4];

        int _roomNumber;

};

  • Wall

下面的类描述了一个房间的每一面所出现的墙壁或门。

class Wall: public MapSite {

public :

        Wall();

        virtual void Enter();

};

  • Door

class Door: public MapSite {

public:

        Door(Room* = 0, Room* = 0);

        virtual void Enter();

        Room* OtherSideFrom(Room*);

private:

        Room* _room1;

        Room* _room2;

        bool _isOpen;

};

  • Maze

我们不仅需要知道迷宫的各部分,还有定义一个用来表示房间集合的Maze类。用RoomNo操作和给定的房间号,Maze就可以找到一个特定的房间。

class Maze {

public:

        Maze();

        void AddRoom(Room*);

        Room* RoomNo(int ) const;

private:

        //...

};

RoomNo可以使用线性搜索、hash表、甚至一个简单数组进行一次查找。但此处并不关心,而是将注意力集中于如何指定一个迷宫对象的构件上。

        我们定义的另一个类是MazeGame,由它来创建迷宫。一个简单直接的创建迷宫的方法是使用一系列操作将构件增加到迷宫中,然后连接它们。例如,下面的成员函数将创建一个迷宫,这个迷宫由两个房间和它们之间的一扇门组成:

Maze* Maze Game:CreateMaze() {

Maze* aMaze = new Maze;

Room* r1 = new Room(1);;

Room* r2 = new Room(2);

Door* theDoor  = new Door(r1, r2);

aMaze->AddRoom(r1);

aMaze->AddRoom(r2);

r1->SetSide(North, new Wall);

r1->SetSide(East, theDoor);

r1->SetSide(South, new Wall);

r1->SetSide(West, new Wall);

r2->SetSide(North, new Wall);

r2->SetSide(East, new Wall);

r2->SetSide(South, new Wall);

r2->SetSide(West, theDoor);

return aMaze;

}

考虑到这个函数所作的仅仅是创建一个有两个房间的迷宫,它是相当复杂的。显然有办法使它变得更简单。例如,Room的构造器可以提前用墙壁来初始化房间的每一面。

        

采用PyQt5框架与Python编程语言构建图书信息管理平台 本项目基于Python编程环境,结合PyQt5图形界面开发库,设计实现了一套完整的图书信息管理解决方案。该系统主要面向图书馆、书店等机构的日常运营需求,通过模块化设计实现了图书信息的标准化管理流程。 系统架构采用典型的三层设计模式,包含数据存储层、业务逻辑层和用户界面层。数据持久化方案支持SQLite轻量级数据库与MySQL企业级数据库的双重配置选项,通过统一的数据库操作接口实现数据存取隔离。在数据建模方面,设计了包含图书基本信息、读者档案、借阅记录等核心数据实体,各实体间通过主外键约束建立关联关系。 核心功能模块包含六大子系统: 1. 图书编目管理:支持国际标准书号、中国图书馆分类法等专业元数据的规范化著录,提供批量导入与单条录入两种数据采集方式 2. 库存动态监控:实时追踪在架数量、借出状态、预约队列等流通指标,设置库存预警阈值自动提醒补货 3. 读者服务管理:建立完整的读者信用评价体系,记录借阅历史与违规行为,实施差异化借阅权限管理 4. 流通业务处理:涵盖借书登记、归还处理、续借申请、逾期计算等标准业务流程,支持射频识别技术设备集成 5. 统计报表生成:按日/月/年周期自动生成流通统计、热门图书排行、读者活跃度等多维度分析图表 6. 系统维护配置:提供用户权限分级管理、数据备份恢复、操作日志审计等管理功能 在技术实现层面,界面设计遵循Material Design设计规范,采用QSS样式表实现视觉定制化。通过信号槽机制实现前后端数据双向绑定,运用多线程处理技术保障界面响应流畅度。数据验证机制包含前端格式校验与后端业务规则双重保障,关键操作均设有二次确认流程。 该系统适用于中小型图书管理场景,通过可扩展的插件架构支持功能模块的灵活组合。开发过程中特别注重代码的可维护性,采用面向对象编程范式实现高内聚低耦合的组件设计,为后续功能迭代奠定技术基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值