本文参考文献:GeekBand课堂内容,授课老师:李建忠

:大话设计模式

其余的模式方法请自行查看Geekband相关课程,在此不累述。

这周的课题是:

  针对DrawingSystem中的基类Shape和各个子类Line、Rec、Circle。为支持更多的形状子类,请使用某种模式来支持灵活地创建它们。使用松耦合面向对象设计方法和思想,可使用伪码表示设计。

  课程中提到了四种模式,“工厂方法”、“抽象工厂”、“原型模式”、“构建器”模式。最后聚焦在了“工厂方法”和“抽象工厂”这两种方法,那么第一个问题就是“工厂方法”、“抽象工厂”区别与联系?

一、工厂方法和抽象工厂区别:

工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类

抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类

这里有更为详细的解释:

http://blog.csdn.net/wyxhd2008/article/details/5597975

总之,关键字在于“相互依赖的对象,多个业务层次”,而本题中,各个子类之间并没有说明之间有相互依赖的关系,故最终决定采用工厂方法模式

二、结构图

三、通过代码和上述结构分析

普通的调用关系为:

在函数中,普通的new 关系,实际上将ashape 与 Circle() 耦合,每次需求改变都要重新修改源代码,这样非常不适合软件的迭代。

Shape * ashape = new Circle();

而在工厂模式中,如下述代码,红色代码,这是松耦合设计的思想。

class MainForm : public Form
{
ShapeFactory* factory;//工厂 public:
MainForm(ShapeFactory* factory)
{
this->factory = factory;
}
virtual ~MainForm(); void MainCreate()
{
//多态new
Shape * ashape =factory->CreateShape();
//获取No
ashape->GetNo();
}
};

那么怎么实现的呢?

对应上图,我们实现了下面四段代码,分别是抽象的Shape 、ShapeFactory、具体的子类 、如Circle、具体的子类工厂如、CircleFactory

class Shape
{
public:
Shape(int no = ) :no_(){}
virtual ~Shape(){}
int GetNo(){ return no_; }
int SetNo(int no_){} private:
int no_;
};
class ShapeFactory
{
public:
ShapeFactory();
virtual Shape * CreateShape() = ;
virtual ~ShapeFactory(){}
};
//具体类
class Line : public Shape
{
public:
Line(){}
virtual ~Line(){}
}; class Rec : public Shape
{
public:
Rec(){}
virtual ~Rec(){} }; class Circle : public Shape
{
public:
Circle(){}
virtual ~Circle(){}
};
//具体工厂
class LineFactory : public ShapeFactory
{
public:
LineFactory();
virtual ~LineFactory();
virtual Shape* CreateShape()
{
return new Line();
}
}; class RecFactory : public ShapeFactory
{
public:
RecFactory();
virtual ~RecFactory();
virtual Shape* CreateShape()
{
return new Rec();
}
}; class CircleFactory : public ShapeFactory
{
public:
CircleFactory();
virtual ~CircleFactory();
virtual Shape* CreateShape()
{
return new Circle();
}
};

四、小结

1、工厂模式用于隔离对象的使用者和具体类型之间的耦合关系。(红色字体部分)

2、工厂模式通过面向对象的方法,将所要创建的具体对象延迟到子类,从而实现一种扩展(而非更改)的策略,较好的解决了这种紧耦合的关系

3、工厂模式解决单个对象的需求变化,缺点在于要求创建的方法和参数相同

[GeekBand] 设计模式——工厂模式学习笔记的更多相关文章

  1. [GeekBand] 设计模式之观察者模式学习笔记

    本文参考文献::GeekBand课堂内容,授课老师:李建忠 :网络资料: http://blog.csdn.net/hguisu/article/details/7556625 本文仅作为自己的学习笔 ...

  2. .NET设计模式: 工厂模式

    .NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html   .NET设计模式(1): ...

  3. 【设计模式】Java设计模式 -工厂模式

    [设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...

  4. SQL反模式学习笔记1 开篇

    什么是“反模式” 反模式是一种试图解决问题的方法,但通常会同时引发别的问题. 反模式分类 (1)逻辑数据库设计反模式 在开始编码之前,需要决定数据库中存储什么信息以及最佳的数据组织方式和内在关联方式. ...

  5. SQL反模式学习笔记5 外键约束【不用钥匙的入口】

    目标:简化数据库架构 一些开发人员不推荐使用引用完整性约束,可能不使用外键的原因有一下几点: 1.数据更新有可能和约束冲突: 2.当前的数据库设计如此灵活,以至于不支持引用完整性约束: 3.数据库为外 ...

  6. SQL反模式学习笔记3 单纯的树

    2014-10-11 在树形结构中,实例被称为节点.每个节点都有多个子节点与一个父节点. 最上层的节点叫做根(root)节点,它没有父节点. 最底层的没有子节点的节点叫做叶(leaf). 中间的节点简 ...

  7. SQL反模式学习笔记2 乱穿马路

    程序员通常使用逗号分隔的列表来避免在多对多的关系中创建交叉表, 将这种设计方式定义为一种反模式,称为“乱穿马路”. 目标:  存储多属性值,即多对一 反模式:将多个值以格式化的逗号分隔存储在一个字段中 ...

  8. SQL反模式学习笔记4 建立主键规范【需要ID】

    目标:建立主键规范 反模式:每个数据库中的表都需要一个伪主键Id 在表中,需要引入一个对于表的域模型无意义的新列来存储一个伪值,这一列被用作这张表的主键, 从而通过它来确定表中的一条记录,即便其他的列 ...

  9. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

随机推荐

  1. Sql Server 2014完全卸载

    经历过好多次Sql server的安装与卸载,有时发现自己卸载的费时费力,单纯地卸载个软件就要吐血了,那么现在我觉得是时候整理一下了. 1.在运行中输入services.msc,然后找到所有跟Sql ...

  2. jvm compile

    >>>Making sec-files-win @ Thu Oct 17 20:34:02 CST 2013 ... >>>Making jgss-files @ ...

  3. 洛谷 P3131 [USACO16JAN]子共七Subsequences Summing to Sevens

    P3131 [USACO16JAN]子共七Subsequences Summing to Sevens 题目描述 Farmer John's NN cows are standing in a row ...

  4. ajax的post请求与编码

    window.onload = function(){ document.getElementById('username').onblur = function(){ var name = docu ...

  5. Qt5官方demo解析集28——Extending QML - Signal Support Example

    本系列全部文章能够在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 接上文Qt5官方demo解析集27--Extendin ...

  6. win8.1 “服务器运行失败”的解决方法

    平台:win8.1 SP1 问题:安装QQ安全管家又卸载后出现了奇怪的问题,1.在桌面点右键→个性化时,提示“服务器运行失败”.2.右键点击“这台电脑”,选择“属性”时没有反应.3.开始屏幕里随便选择 ...

  7. oled模块的驱动芯片和pcb图

    参考自:http://blog.sina.com.cn/s/blog_57ad1bd20102wtq8.html oled的驱动芯片是:SSD1306驱动芯片,这个芯片嵌入在屏幕里面,从外面看不出来, ...

  8. jmeter--元件的作用域与执行顺序

    1.元件的作用域 JMeter中共有8类可被执行的元件(测试计划与线程组不属于元件),这些元件中,取样器是典型的不与其它元件发生交互作用的元件,逻辑控制器只对其子节点的取样器有效,而其它元件(conf ...

  9. 百度ueditor vue项目应用 -- 图片上传源码修改

    本文目的有两个,一.废掉单图上传,二.改造多图上传 大家都知道百度ueditor不是针对vue项目开发的,官方文档提供的源码包里有需要后端配置的接口,but到vue项目就不太好办了,网上有些文章也介绍 ...

  10. Understanding Cubert Concepts(一)Partitioned Blocks

    Understanding Cubert Concepts(一)Partitioned Blocks Cubert Concepts 对于Cubert,我们要理解其核心的一些概念,比方BLOCK.这些 ...