工厂模式有几种(工厂方法模式图文详解)
工厂模式有几种(工厂方法模式图文详解)它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法 工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。工厂方法模式包含如下4类角色:它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类这个角色实现了抽象产品角色所声明的接口 工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
工厂方法模式是简单工厂模式的进一步抽象和升级,解决了简单工厂模式每当添加新的产品品类的时候,都需要修改工厂类的问题。
工厂方法模实现了可扩展,同时还满足了开闭设计模式的原则,使用频次也更高@mikechen
工厂方法模式的定义工厂方法模式(英语:Factory method pattern),它属于类创建型模式,也被称为多态工厂模式,其定义了一个创建某种产品的接口,但由子类决定要实例化的产品是哪一个,从而把产品的实例化推迟到子类。
在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做,这个核心类则摇身一变,成为了一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触产品类被实例化的细节。
工厂方法模式的结构工厂方法模式包含如下4类角色:
1.Product:抽象产品它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类
2.ConcreteProduct:具体产品这个角色实现了抽象产品角色所声明的接口 工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
3.Factory:抽象工厂抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
4.ConcreteFactory:具体工厂它是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法 工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
工厂方法模式的实现 1.创建抽象工厂类创建抽象工厂类的主要作用:定义具体工厂的公共接口。
package com.mikechen.java.design.factory.method;
/**
* 抽象工厂
*
* @author mikechen
*/
public abstract class AbstractFactory {
public abstract AbstractProduct produceProduct();
}
2.创建抽象产品类
创建抽象产品类的主要作用:定义具体产品的公共接口。
package com.mikechen.java.design.factory.method;
/**
* 抽象产品
*
* @author mikechen
*/
public abstract class AbstractProduct {
public abstract void make();
}
3.创建具体产品类
创建具体产品类的主要作用:继承抽象产品类,定义生产的具体产品。
1)具体产品Apackage com.mikechen.java.design.factory.method;
/**
* 目标产品A
*
* @author mikechen
*/
public class ConcreteProductA extends AbstractProduct {
@Override
public void make() {
System.out.println("产品A出炉");
}
}
2)具体产品B
package com.mikechen.java.design.factory.method;
/**
* 目标产品B
*
* @author mikechen
*/
public class ConcreteProductB extends AbstractProduct {
@Override
public void make() {
System.out.println("产品B出炉");
}
}
4.创建具体工厂类
创建具体工厂类的主要作用:创建具体工厂类(继承抽象工厂类),定义创建对应具体产品实例的方法。
1)具体工厂Apackage com.mikechen.java.design.factory.method;
/**
* 目标工厂A
*
* @author mikechen
*/
public class ConcreteFactoryA extends AbstractFactory {
@Override
public AbstractProduct produceProduct() {
return new ConcreteProductA();
}
}
2)具体工厂B
package com.mikechen.java.design.factory.method;
/**
* 目标工厂B
*
* @author mikechen
*/
public class ConcreteFactoryB extends AbstractFactory {
@Override
public AbstractProduct produceProduct() {
return new ConcreteProductB();
}
}
工厂方法模式的优缺
1)遵循开闭原则
无需更改现有客户端代码,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可 而简单工厂模式需要修改工厂类的判断逻辑。
2)遵循单一职责原则
每个具体工厂类只负责创建对应的产品 而简单工厂中的工厂类存在复杂的switch逻辑判断。
3)不使用静态工厂方法
不使用静态工厂方法,可以形成基于继承的等级结构,简单工厂模式的工厂类使用静态工厂方法。
2.缺点每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
工厂方法模式的应用场景首先,工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。
其次,需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。
再次,当每个对象的创建逻辑都比较复杂的时候,为了避免设计一个过于庞大的简单工厂类时,将创建逻辑拆分得更细,每个对象的创建逻辑独立到各自的工厂类中。
工厂方法模式的总结工厂方法模式是简单工厂模式的进一步抽象和推广,由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
更多架构技术干货,私信【架构】即可查看我原创的300期 BAT架构技术系列文章与1000 大厂面试题答案合集。