自定义的公寓树
![](https://upload-images.jianshu.io/upload_images/6177207-b45a121d2e46c3d8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
大雄不想做作业了,想逃离父母管教,拥有自己的公寓的时候,哆啦A梦给他一颗公寓树,满足了这个想法。公寓树可以根据自己的需要向土里延申,创建出运动房、餐厅、书房。当胖虎、静香、阿福过来了,又满足了他们的想法,创建出棒球场、钢琴室、游戏室。
这颗树洞就像我们的房间工厂,他不用去知道到底需要创建什么内容,他构造出一个一个内容,由需要的人进行装修设计,摆放自己的家具,他只要满足开放一个门,以便与房间互通规则。
应用与反思
星空里的单据也是这样的,通过动态领域模型抽象出来的实体,我不管对应的对象到底是基础资料(物料、供应商、客户、销售员),还是单据(采购订单、销售订单),还是报表,他们统一都是有MVC组成,抽象的控制器C,抽象视图V以及我们已经存在的抽象实体。
![](https://upload-images.jianshu.io/upload_images/6177207-7e634e037e55eb1e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
工厂就是我们不得不说的名词了,它有两点基本要求:
- 原子的,因为要保证创建对象或者Aggregate的所有固定规则,Factory创建的对象都要处于一致的状态;
- 工厂应当被抽象为所需的类型,而不是具体类。创建型的设计模式是我们常用的方式,有的时候还可以用构造函数,是一种实现策略,当然有的时候增加接口,是为了我们能耦合参数。
重建对象
回归到工厂构建对象,我们不但在新建对象的时候需要使用到工厂,在从持久化的内容中,重建对象的时候,应当满足下面要求,
- 不分配新的ID,也就是继续使用旧对象持久化的唯一标识,这也是实体具有的特点;
- 不满足固定规则的应该拒绝创建或者忽略掉,否则创建出的对象因某属性不存在,而存在缺陷。