[GeekBand] 设计模式——工厂模式学习笔记

         本文参考文献: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 = 0) :no_(){}
    virtual ~Shape(){}
    int GetNo(){ return no_; }
    int SetNo(int no_){}

private:
    int no_;
};
class ShapeFactory
{
public:
    ShapeFactory();
    virtual Shape * CreateShape() = 0;
    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、工厂模式解决单个对象的需求变化,缺点在于要求创建的方法和参数相同

时间: 2024-10-15 14:03:09

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

设计模式——工厂模式学习

1.概念 工厂模式定义:实例化对象,用工厂方法代替new操作.达到解耦的目的(避免硬编码耦合).工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例

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

本文参考文献::GeekBand课堂内容,授课老师:李建忠 :网络资料: http://blog.csdn.net/hguisu/article/details/7556625 本文仅作为自己的学习笔记,不代表权威,因为是初学,有错误烦请大家指正,谢谢. 1.什么是观察者模式,应用场所有哪些? 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它

简单工厂模式 - 学习笔记

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式可以分为三类: 简单工厂模式(Simple Factory) 工厂方法模式(Factory Method) 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性. 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口.工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类

设计模式——抽象工厂模式学习

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的. 抽象工厂设计模式概念: 针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设计模式的精髓,工厂方法模式针对的是一个产品等级结构:而抽象工厂模式针对的是多个产品等级结构.有些观点认为抽象工厂模式是为了解决客户端代码与工厂类的耦合问题,我认为这种观点的解决方案只是简单工厂模式的一个应用,而这种观点认为的抽象工厂模式是: 工厂模式+简单工厂模式=抽象工厂模式,这是不正确. 针对的问题: 针对

5分钟读书笔记之 - 设计模式 - 工厂模式

一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一种模式,它使用一种方法来决定究竟实例化那个具体的类. 简单工厂模式 假设你想开几个自行车商店,每个商店都有几种型号的自行车出售,可以用这样一个类来表示: var BicycleShop = function(){} BicycleShop.prototype = { sellBicycle:func

创建型-抽象工厂模式学习

1.抽象工厂模式的意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.抽象工厂模式的适用性: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 3.场景描述: 考虑一个生产多种不同风格的家具的工厂(FurnitureFactory),不同风格的家具系列可以提供不同的门.窗.地板等的组合,为同一所住房可以提供不同

WPF-MVVM模式学习笔记3——MVVM概念再次挖掘

通过上篇文章<WPF-MVVM模式学习笔记2--MVVM简单样例>中举了一个例子,我对MVVM大概有了一个比较浅显的意思.同时,看过前两篇文章的人,也知道我的这个系列的文章大多数来源于其他的博客,我其实只是起了一个汇总的作用,毕竟我也是在学习,肯定是要去网络上学习别人的笔记喽.本篇文章将以温故而知新的方式再次去理解MVVM,力求对MVVM的认识再深一个层次. 1.再看"M-V-VM" M:即Model,由现实世界抽象出来的模型. V:即View,视图,界面,该界面与用户输入

设计模式--单例模式(学习笔记)

定义:      单例模式:保证一个类只有一个实例,并且提供一个访问它的全局访问点.(<大话设计模式定义>): 单例模式分为两种: 1>饿汉式单例类:自己被加载时就将自己实例化. 例子:       private SingleExample() {           } private static SingleExample singleExample=new SingleExample(); @Override protected SingleExample getInstanc

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory