创建型模式
在本节作业中,你将主要关注工厂方法模式和抽象工厂模式这两种创建型设计模式。
在本节你一共需要绘制一张类图,请任选一个STEP,在选择设计模式后额外画出类图。
在完成所有STEP的任务之后,你还需要用自己的语言简单总结这两种设计模式的意图和应用场景,并和STEP的解答一同放在最终提交的PDF中。
STEP1
Alice 觉得智能指针的使用太麻烦了,比如说她想用unique_ptr管理一个vector,她就得:
auto ptr = std::make_unique<std::vector<int>>();
最重要的是,Alice 记不住怎么创建智能指针,导致她每次想用都要去搜一遍cppreference,这可不行!于是Alice打算自己创建一个接口专门用于创建由智能指针管理的vector,她计划至少实现unique_ptr、shared_ptr和weak_ptr三种智能指针管理的vector的创建。同时,考虑到C++可能会在之后的版本推出更多的智能指针,她还希望自己的设计有足够的可拓展性。
请为Alice 选择合适的设计模式。 (如果你打算画类图,为了统一接口,你可能得给标准库类型做一些包装。具体怎么包装的不用体现在类图里,类名能反映出谁包装了谁就行,实在担心那就加注释)
STEP2
C++标准库中的容器太多了,这导致Alice 每次想要创建一个容器时,都要纠结好久应该选择哪一个容器。Alice决定想想办法解决一下这个问题。首先她给容器分成了两类:顺序容器(vector,deque,list等)和关联容器(map,unordered_map等)。她认为在某个应用场景下,只需要使用一种顺序容器和一种关联容器就足以满足需要,不需要过多权衡。
她简单设想了三个应用场景,一种是一般场景,用vector和map就能满足大部分需要;一种是注重时间效率场景,用vector和unordered_map以进行加速;一种是需要从头部插入的特殊场景,用deque和map。
她希望设计这样的功能,在选择好应用场景后,就能提供两个接口分别返回相应的顺序容器和关联容器。她还希望设计有足够的可拓展新,因为她可能会遇到更多的场景。
请为Alice 选择合适的设计模式。 (如果你打算画类图,为了统一接口,你可能得给标准库类型做一些包装。)
TIPS
- 工厂这个概念在计算机领域很常见,一般用来代指一个专门用于创建对象的类或者模块。如何设计好一个工厂是一门相当复杂的学问,工厂方法模式和抽象工厂模式只是为工厂的设计提供了一个可拓展易用使用的框架,而如何填补框架里的肉就是另外的考虑了。同时,基于需求的不同,也不是所有的工厂都应该遵循这两个设计模式。不要把这两个设计模式当成工厂的全部!
- 为了方便大家完成作业,我们作业中的场景都非常简单,在实际编码中,对于像我们作业这样的简单场景,实际上是不推荐使用工厂模式的,这属于过度设计。一般来说只在有足够的理由时(如对象创建逻辑比较复杂)才考虑为一个类创建工厂类和工厂方法。
简单工厂模式去哪了?
细心的同学应该已经发现简单工厂模式并不包括在23个 GoF 设计模式之中,原因是它太简单太自然了,比起一个设计模式更像是一种编程习惯(而且这个设计也不怎么好,它甚至不满足开闭原则!),它在课程中只是作为一个引子用于引出接下来的两种工厂模式,在实际的编码中很少会直接采用简单工厂这样的设计,我们也不会对这个概念做过多的说明和解释(你忘了它也无所谓)。