本文参考文献: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. OpenCV func

    cvLoadImage("lena.jpg", CV_LOAD_IMAGE_COLOR);  //CV_LOAD_IMAGE_GRAYSCALE   //0

  2. Android 监听软键盘点击回车及换行事件

    mEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean ...

  3. 格式化时间的一个好方法(补充moment)

    /** * * 格式化时间 * @param {*} time * @param {*} fmt * @returns * time(new Date(), 'yyyy/MM/dd') ==> ...

  4. 常用协议(SPI, UART, I2C)

    SPI: SPI是全双工的同步串行接口,数据速率可达几Mbps,在一般应用中有4根信号线:MOSI, MISO, SCK, SS. 根据时钟极性(CPOL)及相位(CPHA)不同可以组合成4种工作模式 ...

  5. UVA 11859 - Division Game

    看题传送门 题目大意 有一个n * m的矩阵,每个元素均为2~10000之间的正整数,两个游戏者轮流操作.每次可选一行中的1个或者多个大于1的整数把它们中的每个数都变成它的某个真因子,比如12可以变成 ...

  6. 10.12 android输入系统_InputStage理论

    android应用程序对输入系统的处理分为多个阶段,我们把这些阶段称为InputStage 理论处理流程: (1)activity发给window,如果window不能处理,再由activity处理; ...

  7. BUFSIZ

    转http://www.judymax.com/archives/262 今天在看示例程序时冒出来一句args = emalloc(BUFSIZ); BUFSIZ是什么意思,查了一下才明白. 这是st ...

  8. UVA - 1161 Objective: Berlin(最大流+时序模型)

    题目大意:有n个城市m条航线.给出每条航线的出发地,目的地,座位数,起飞时间和到达时间(所给形式为HHMM.记得转化),再给出城市A和B.和到达城市B的最晚时间.如今问一天内最多有多少人能从A飞到B, ...

  9. HDU4911-Inversion

    题意:依据题目要求交换相邻的两个元素k次,使得最后剩下的逆序对数最少 思路:假设逆序数大于0,存在0 <= i < n使得交换Ai,Ai+1后逆序数降低1,所求答案就为max(invers ...

  10. keil快捷键