原型模式提出的背景
在软件开发中,对象的创建方式往往直接影响系统的扩展性和维护成本。传统做法是通过new直接实例化具体类,这会让调用方与具体类紧密耦合在一起:一旦需要新增或替换某个对象类型,就必须改动所有相关调用代码。
原型模式正是在这样的背景下提出的。它的核心思路是:把一个对象作为“原型”,通过克隆clone()来生成新对象,而不是依赖new直接创建,从而降低耦合、提升系统的灵活性与扩展性。
以本文中的文件分割器为例:
- 高层代码只依赖抽象基类
ISplitter,不直接依赖BinarySplitter、TxtSplitter等具体类; - 新增一种分割器时,只需让新类继承
ISplitter并实现clone(),原有调用代码无需修改; - 对象创建逻辑被封装在具体类的
clone()内部,符合“封装变化”的设计原则。
案例
创建基类抽象类
//抽象类classISplitter{public:virtualvoidsplit()=0;virtualISplitter*clone()=0;//通过克隆自己来创建对象virtual~ISplitter(){}};然后创建几个子类继承于ISplitter基类:
classBinarySplitter:publicISplitter{public:virtualISplitter*clone(){returnnewBinarySplitter(*this);//返回子类对象}};classTxtSplitter:publicISplitter{public:virtualISplitter*clone(){returnnewTxtSplitter(*this);}};使用:
classMainForm:publicForm{ISplitter*prototype;//基类指针public:MainForm(ISplitter*prototype){this->prototype=prototype;}voidButton1_Click(){ISplitter*splitter=prototype->clone();splitter->split();}};