文章目录
工厂模式介绍
1、简介:
工厂模式是属于23种设计模式中的一种常用的创建型模式(另外两种:结构型、行为型),它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口(抽象类)来指向新创建的对象。创建型模式常和行为型模式配合使用。
2、什么情况下使用:
(1)在编码时不能预见需要创建哪种类的实例。
(2)系统不依赖于产品类实例如何被创建、组合和表达的细节
三类工厂模式
1、简单工厂模式:
(1)简介:简单工厂模式又叫做静态工厂方法(Static Factory Method)模式,不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
(2)三个角色:抽象产品、具体产品、产品工厂
(3)DEMO
(4)优缺点:
优点:简单工厂模式能够根据外界给定的信息,决定创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR(职责分配原则)的高内聚的责任分配原则,而且简单工厂模式不利于扩展,每增加一个产品类,都需要修改工厂的逻辑实现,违反开闭原则(对扩展开放,对修改关闭)
2、工厂方法模式
(1)简介:工厂方法模式(Factory Method),又称多态性工厂模式。核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。工厂方法模式解决了简单工厂模式存在的问题,首先完全实现“开闭原则”,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
(2)四个角色:抽象产品、具体产品、抽象工厂、具体工厂
(3)DEMO
抽奖工厂类
具体工厂方法
(4)优缺点:
优点:
① 子类提供挂钩。基类为工厂方法提供缺省实现,子类可以重写新的实现,也可以继承父类的实现。—— 加一层间接性,增加了灵活性
② 屏蔽产品类。产品类的实现如何变化,调用者都不需要关心,只需关心产品的接口,只要接口保持不变,系统中的上层模块就不会发生变化。
③ 典型的解耦框架。高层模块只需要知道产品的抽象类,其他的实现类都不需要关心,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。
④ 多态性:客户代码可以做到与特定应用无关,适用于任何实体类。
缺点:每增加一个产品,相应的要添加一个子工厂;或者当产品结构复杂的时候,如可以划分为产品等级和产品族的时候,就要工厂做复杂处理,加大了额外的开发量。
(5)延迟初始化:工厂方法模式还有一个非常重要的应用,就是延迟初始化(Lazy initialization),一个对象初始化完毕后就不释放,等到再次用到得就不用再次初始化了,直接从内存过中拿到就可以了。
private static HashMap<String,Human> humans = new HashMap<String,Human>();
//如果MAP中有,则直接从取出,不用初始化了
if (humans.containsKey(c.getSimpleName())) {
human = humans.get(c.getSimpleName());
} else {
human = (Human)Class.forName(c.getName()).newInstance();
//放到MAP中
humans.put(c.getSimpleName(), human);
}
(6)产品等级结构和产品族:
产品等级结构:产品等级结构即产品的继承结构,如上述例子中一个抽象类是人类(Human),其子类有黄种人(YellowHuman)、白种人(WhiteYellow)、黑种人(BlackHuman),则人类与具体种类的人之间构成了一个产品等级结构,抽象类(Human)是父类,而具体种类的人类是其子类。
产品族:产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如上述列子中子类添加一个性别区分男女的时候,在原有工厂的情况下需要做复杂的逻辑区分;这时候我们就要在抽象出两个工厂分别来生产男性人类、女性人类;而男性黄种人、男性白种人、男性黑种人就组成了一个产品族。具体实现就需要使用抽象工厂模式了。
3、抽象工厂模式
(1)简介:抽象工厂模式在所有工厂模式中最为抽象和最具一般性,是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定具体产品的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例;换言之,也就是这些抽象产品的具体子类的实例。
(2)类图:
(3)DEMO
三个抽象类:AbstractYellowHuman、AbstractBlackHuman、AbstractWhiteHuman
六个带有性别的具体产品类:YellowMaleHuman、YellowFemaleHuman、BlackMaleHuman、BlackFemaleHuman、WhiteMaleHuman、WhiteFemaleHuman
Spring IOC和工厂模式的对比
1、IOC是使用了反射的技术来动态生成对象,相对于直接生成对象效率要低一点,但是更灵活。
2、工厂模式的对象生产是提前在工厂类中定义好。
3、选用:凡是可以使用工厂模式的地方都可以优先考虑使用Spring的IOC来实现。
用Spring IOC实现工厂模式DEMO(优化抽奖活动配置)
1、定义个抽奖的接口
2、具体抽奖类
3、抽奖类型枚举
4、抽奖工厂
5、服务层
6、服务接口实现
7、测试
扩展-设计模式的分类
1、创建型模式:
单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
2、结构型模式:
适配器模式、装饰者模式、代理模式、门面模式(外观模式)、桥梁模式、组合模式、享元模式。
3、行为型模式:
策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
4、扩展模式(最新扩展):
规则模式、对象池模式、雇工模式、黑板模式、空对象模式。