本周主要讲了工厂方法、抽象工厂、原型模式、构建器、门面模式、代理模式、适配器和中介者。
工厂方法
抽象工厂
原型模式
构建器
门面模式
中介者
代理模式
适配器
本周作业
针对DrawingSystem中的基类Shape和各个子类Line、Rec、Circle。为支持更多的形状子类,请使用某种模式来支持灵活地创建它们。使用松耦合面向对象设计方法和思想,可使用伪码表示设计。
复习本周所讲的设计模式,初步将目标锁定在了工厂和抽象工厂上。
那么这两者有什么区别呢?
工厂方法与抽象工厂的区别
工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类
抽象工厂模式:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类
本题中,各个子类之间并没有说明之间有相互依赖的关系,故最终决定采用工厂方法模式。
根据上述思路,完了以下几段代码:
抽象的shape
class Shape
{
public:
Shape(int no = 0) :no_(){}
virtual ~Shape(){}
int GetNo(){ return no_; }
int SetNo(int no_){}
private:
int no_;
};
ShapeFactory
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();
}
};
总结
- 工厂模式用于隔离对象的使用者和具体类型之间的耦合关系。(红色字体部分)
- 工厂模式通过面向对象的方法,将所要创建的具体对象延迟到子类,从而实现一种扩展(而非更改)的策略,较好的解决了这种紧耦合的关系
- 工厂模式解决单个对象的需求变化,缺点在于要求创建的方法和参数相同