工厂模式可以细化三个分类:简单工厂、工厂方法、抽象工厂。
1、简单工厂
简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可。但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护。
代码案例
文件01:Car.java
package cn.itchao.factory.simple;
public interface Car {
void run();
}
文件02:BydCar.java
package cn.itchao.factory.simple;
public class BydCar implements Car {
@Override
public void run() {
System.out.println("制造一台比亚迪汽车");
}
}
文件03:AuDiCar.java
package cn.itchao.factory.simple;
public class AuDiCar implements Car{
@Override
public void run() {
System.out.println("制造一台奥迪汽车");
}
}
文件04:CarFactory.java
package cn.itchao.factory.simple;
public class CarFactory {
public static Car newCar(String name){
if(null==name||"".equals(name)){
return null;
}
if("比亚迪".equals(name)){
return new BydCar();
}
if("奥迪".equals(name)){
return new AuDiCar();
}
return null;
}
}
测试代码:
package cn.itchao.factory.simple;
public class Test01 {
public static void main(String[] args) {
Car BydCar = CarFactory.newCar("比亚迪");
Car AuDiCar = CarFactory.newCar("奥迪");
BydCar.run();
AuDiCar.run();
}
}
运行结果:
/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/lib/tools.jar:/local/idea_work/study/itchao-design-mode/target/classes cn.itchao.factory.simple.Test01
制造一台比亚迪汽车
制造一台奥迪汽车
Process finished with exit code 0
总结:
优点:简单工厂模式能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
缺点:很明显工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则。
2、工厂方法
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
代码案例:
(1)、创建抽象工厂类,定义具体工厂的公共接口
package cn.itchao.factory.method;
abstract class AbstractFactory {
//定义一个抽象的 "制造方法"
public abstract AbstractProduct manufacture();
}
(2)、 创建抽象产品类 ,定义具体产品的公共接口
package cn.itchao.factory.method;
abstract class AbstractProduct {
public abstract void show();
}
(3)、创建具体产品类(继承抽象产品类), 定义生产的具体产品
package cn.itchao.factory.method;
/**
* @Description:具体的奥迪汽车生产类
*/
public class AuDiCar extends AbstractProduct {
@Override
public void show() {
System.out.println("生产一台奥迪汽车");
}
}
package cn.itchao.factory.method;
/**
* @Description:具体的比亚迪汽车生产类
*/
public class BydCar extends AbstractProduct {
@Override
public void show() {
System.out.println("生产一台比亚迪汽车");
}
}
(4)、创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法
package cn.itchao.factory.method;
/**
* @Description:比亚迪工厂类生产比亚迪汽车
*/
public class BydFactory extends AbstractFactory {
@Override
public AbstractProduct manufacture() {
return new BydCar();
}
}
package cn.itchao.factory.method;
/**
* @Description:奥迪工厂类生产奥迪汽车
*/
public class AuDiFactory extends AbstractFactory {
@Override
public AbstractProduct manufacture() {
return new AuDiCar();
}
}
(5)、外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例
package cn.itchao.factory.method;
public class Test01 {
public static void main(String[] args) {
//客户需要比亚迪汽车
BydFactory bydFactory = new BydFactory();
bydFactory.manufacture().show();
//客户需要奥迪汽车
AuDiFactory auDiFactory = new AuDiFactory();
auDiFactory.manufacture().show();
}
}
测试结果:
总结:
优点:
(1)更符合开-闭原则,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可,
简单工厂模式需要修改工厂类的判断逻辑
(2)符合单一职责原则 ,每个具体工厂类只负责创建对应的产品,
简单工厂中的工厂类存在复杂的switch逻辑判断或者if判断
(3)不使用静态工厂方法,可以形成基于继承的等级结构,
简单工厂模式的工厂类使用静态工厂方法
工厂方法模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现
3、抽象工厂
上面提到的工厂方法存在一个严重的不足之处,一个具体的工厂只能创建一类产品,而在实际工作中往往一个工厂需要生产多类产品,为了解决这个不足之处,所以我们又有一种新的设计模式:抽象工厂模式
定义:抽象工厂模式,即Abstract Factory Pattern,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例
作用:允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
代码案例:
(1)、创建抽象工厂类,定义具体工厂的公共接口
参考:https://blog.csdn.net/carson_ho/article/details/54910287