创建型:描述封装对象是如何被创建的
两种表示方式:
- 生成创建对象的类的子类来创建对象(工厂方法)
- 将负责明确产品对象的类作为系统参数,涉及到创建到创建一个新的负责创建对象的“工厂对象”, (抽象工厂(产生多个类的对象)、builer(使用协议->产品)、prototype(通过拷贝原型对象来创建产品对象))
//1 Abstract Factory 抽象工厂
//定义:提供创建一系列相互依赖于对象的接口,而无需指定他们具体的类。
//场景:a 一个系统独立于他的产品的创建、组合、表示。 b 一个系统要由多个产品系列中的一个来配置。
//效果 a 分离具体类 b 易于交换产品系列 c 有利于产品一致性 d 难以支持新种类产品.
// 备注: 一个具体的工厂通常作为一个单件。
MazeGame game;
EnchantedMazeFactory mf;
game.GreateMazeFactor(mf);
//2 builder 建造者
//定义:a 将一个复杂对象的创建与表示分离 b 使用同样的创建过程可以创建不同的表示。
//场景:a 当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时。
// b 当构造过程必须允许被构造的对象有不同的表示时。
//效果:a 可以改变一个产品的内部表示 b 将构造代码与表示代码分开 c 可对构造过程进行更精细的控制
//备注: 由生成器生成的产品,表示相差一般很大,不太可能有公共接口,所以一般没有抽象类。
StandarMazeBuilder builder;
game.CreateMazeBulid(builder);
Maze* maze = builder.GetMaze();
//3 Factory Method 工厂方法
//定义: 定义一个创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。
//场景: a. 当一个类不知道它所必须创建的对象的类的时候。 b. 当一个类希望他的子类来指定它所创建的对象的时候。
//效果: a 为子类提供挂钩 b 连接平行的类层次
//备注:增加改变产品类,就需要创建一个新的工厂子类。
BomebedMazeGame bagme;
bagme.GreateMaze();
//4 Protatype 原型方法
//定义:通过拷贝原型对象来创建产品对象
//场景:a 当要实例化的类在运行时刻指定它时。b 为避免创建一个与产品类层次平行的工厂类层次时。
//效果:a 运行时增删产品 b 改变值以指定新对象 c 改变结构以指定新对象 d 减少子类的构造
MazePrototypeFactory simpleMazeFactory(new Maze(), new Wall(), new EnchantedRoom(3), new Door());
Maze* maze2 = game.GreateMazeFactor(simpleMazeFactory);
//5 Singleton 单例
single::instance()->setData(7);
int ret = single::instance()->getData();
/*
比较:
Abstract与Builder相似,都可以创建复杂对象,区别在于Builder着重一步步构造复杂对象,Builder在最后一步返回产品。
Abstract着重于构造多个系列的产品对象,产品是立即返回的。
Factory Method使一个设计可以定制且只略微有一些复杂,其他设计模式需要新的类,而Factory Method只需要一个新的操作。
Protatype和Abstract模式存在某方面的竞争,但也可以一起使用,Abstract Factory可以存储一个被克隆的原型集合,返回产品对象。
使用Abstract Factory、Prototype或Builder的设计比使用Factory Method更灵活也更复杂,设计以使用Factory Method开始
当设计者发现需要更大灵活性时,变会像其他创建型模式演化。
*/