设计模式1–工厂模式
目的:实现了对责任的分割。通常由应用程序直接使用 new 创建新的对象,为了将对象的创建和使用相分离,采用工厂模
式,即应用程序将对象的创建及初始化职责交给工厂对象。
分类:简单工厂(Calendar)、工厂方法(logback)、抽象工厂(pool) 对应经典源码。
简单工厂:
以上类图,就可以看出来,其实简单工厂大家平常都会用到,说白了就像是个工具类,通过一个名称通过courseFactory获取对应课程。
public ICourse create(String className){
if(className != null && !className.equals("")){
try {
return (ICourse) Class.forName(className).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
缺点:1、工厂类的责任太重、不易于扩展复杂的产品结构。2、如果新增产品,需要修改现有工厂,违反了封闭开发原则。
优点:实现了对责任的分割。客户端负责消费、工厂负责生产。
工厂方法
以上类图,就可以看出来,其实工厂方法是对工厂进行了抽象,工厂里创建的方法返回的是抽象对象。具体怎么创建、创建出什么样对象是各自工厂实现,主要解决了产品扩展的问题,工厂方法让类的初始化推迟到了子类中进行。
public static void main(String[] args) {
ICourseFactory factory = new PythonCourseFactory();
ICourse course = factory.createVideo();
course.record();
factory = new JavaCourseFactory();
course = factory.createVideo();
course.record();
}
缺点:1、类的数目较多,增加了复杂度。
优点:1、创建对象需要大量重复的代码。2、客户端不依赖产品类如何被创建、实现等细节。3、也满足了封闭开放原则,新增产品需要拓展新的工厂即可。
抽象工厂:
以上类图可以看出 工厂里是抽象的产品等级,提供一个接口,用于创建相关的对象家族。
什么是产品族、产品等级呢?
颜色从深到浅是海尔、美的、奥克斯等不同品牌。这一系列产品相关产品对象就是产品族,正方形:冰箱;园:洗衣机;菱形:彩电,这就是不同的产品等级。
当你的业务形态和上面这幅图一样复杂后,你或许应该考虑抽象工厂。抽象工厂模式 是指提供一个创建一系列相关或相互依赖对象的接口,无须制定他们具体的类,客户端不依赖产品类实例如何被创建、实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
缺点:1、产品等级扩展不友好违反了封闭开放原则,需要对各个抽象类、实现类完成修改。
优点:1、可以很好的对产品等级进行扩展。2、可以满足比较复杂的产品结构。
总结:使用设计模式切记不能有洁癖,生搬硬套,不能为了用而取用,应该跟随业务的具体形态,不断变化 从最简单的 简单工厂 逐步跟随业务脚本 演变成抽象工厂。