对象创建
通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。
工厂机制:通过虚函数创建一个多态的new。
设计原则:避免抽象类依赖具体类。
class SplitterFactory {
public:
ISplitter* CreateSplitter() {
return new BinarySplitter;
}
};
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter(){}
};
class BinarySplitter :public ISplitter {
public:
virtual void split() {
}
};
class TxtSplitter :public ISplitter {
public:
virtual void split() {
}
};
class MainForm{
public:
SplitterFactory factory;
Isplitter* splitter=factory.CreateSplitter();
}
在上述代码的MainForm函数中,在对splitter实例化的过程中,在SpliiterFactory,return new BinarySplitter仍然 依赖了BinarySplitter这个具体的类。
因此可以考虑使用虚函数作为创建对象的工具:
class SplitterFactory {
public:
virtual ISplitter* CreateSplitter() = 0;
virtual ~SplitterFactory(){}
};
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter(){}
};
//具体类
class BinarySplitter :public ISplitter {
public:
virtual void split() {
}
};
class TxtSplitter :public ISplitter {
public:
virtual void split() {
}
};
//创建具体工厂
class BinarySplitterFactory :public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() {
return new BinarySplitter;
}
};
class MainForm {
SplitterFactory* factory;
public:
MainForm(SplitterFactory* factory)
{
this->factory = factory;
}
void Button1_Click() {
ISplitter* splitter = factory->CreateSplitter();
splitter->split();
}
};
在这里,我们将CreateSplitter定义为纯虚函数,具体依赖与子类的重写。接着创建具体工厂,具体工厂继承自基类工厂,然后具体工厂中,定义了返回一个什么样类型的ISplitter。
模式定义:
定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使得一个类的实例化延迟到子类。
目的:解耦
手段:虚函数