简单工厂模式
一、举例
特别喜欢王宝强主演的电视剧“士兵突击”,他那样老实憨厚一根筋,却凭着那份执着,成就了自己的不平凡。
其中有一段,许三多刚调到七连,成才来三班看许三多,白铁军向成才要烟,成才给的是春城,等成才走后白铁军对许三多说:“塔山是给连长排长,红河是给班长班副,春城是给战友的,哪个连都有这样的人,七连揍这一个”。
联系到设计模式:
抽象类:烟
具体实现类:塔山、红河、春城
工厂类:成才
客户端:连长、排长、班长、战友、白铁军
// 接口定义:烟
public interface Cigarette {
// 冒烟方法
public void smoking();
}
// 具体实现对象:塔山
public class TaShan implements Api {
public void smoking() {
System.out.println("我冒的是塔山的烟");
}
}
// 具体实现对象:红河
public class HongHe implements Api {
public void smoking() {
System.out.println("我冒的是红河的烟");
}
}
// 具体实现对象:春城
public class ChunCheng implements Api {
public void smoking() {
System.out.println("我冒的是春城的烟");
}
}
// 工厂类,用来创建Api对象
public class ChengCai {
public static Cigarette getCigarette(String who) {
Cigarette cigarette = null;
if (who.equals("连长") || who.equals("排长")) {
cigarette = new TaShan();
} else if (who.equals("班长")) {
cigarette = new HongHe();
} else if (who.equals("战友")) {
cigarette = new ChunCheng();
}
return cigarette;
}
}
// 客户端:白铁军
public class BaiTiejun {
public static void askCigarette() {
Cigarette cigarette = ChengCai.getCigarette("战友");
}
}
二、用来解决的问题
大家都知道,在Java应用开发中,要“面向接口编程”。为什么要面向接口编程呢? 由于外部调用和内部实现被接口隔离开了,那么只要接口不变,内部实现的变化就不会影响到外部应用,从而使得系统更加灵活,具有更好的扩展性和可维护性,这也验证了那句话“接口是系统可挺拔性的保证”。根据接口的作用和用途,浓缩下来,接口的思想就是:“封装隔离”。
举个接口使用的例子:
Api api = new Impl();
看上面的代码有没有发现什么问题?
想想接口的功能和思想,你会发现客户端调用的时候,客户端不但知道了接口还知道了具体的实现就是Impl。接口的思想是“封闭隔离”,而实现类应该是同接口封装并同客户端隔离开的,也就是说客户端不应该知道具体的实现类就是Impl。
总结起来:工厂设计模式就是为了做到真正的“封装隔离”。
三、定义
提供一个创建对象实例的功能,而无需关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
四、UML图
- AbstractProduct:抽象产品,包含关于产品的抽象方法。
- Product:具体产品,包含对抽象产品的具体实现。
- AbstractFactory:抽象工厂,包含所有产品创建的抽象方法。
- ConcreateFactory:具体工厂,创建具有特定实现的产品对象。
- Client:客户端,通过工厂类获取接口对象,然后面向接口编程。
五、使用场景
- 想要完全封装隔离,让外部只能通过接口来操作封装体。
- 想要对外创建对象的职责集中管理和控制。
六、备注
简单工厂在平常的开发中还是挺常用的,简单而神奇,所以还是应该好所以好掌握它。