在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
模式结构
1.AbstractProduct:抽象产品
2.ConcreteProduct具体产品
3.AbstractFactory抽象工厂
4.ConcreteFactory:具体工厂
UML:
![](https://img.haomeiwen.com/i11245777/263388a5501251c4.jpg)
抽象产品角色
public abstract class Product {
//所有产品类的公共业务方法
public void methodSame() {
//公共方法的实现
}
//声明抽象业务方法
public abstract void methodDiff();
}
具体产品
//具体产品A
public class ConcreteProductA extends Product {
// 产品A实现方法
@Override
public void methodDiff() {
}
}
//具体产品B
public class ConcreteProductB extends Product {
//产品B实现方法
@Override
public void methodDiff() {
}
}
抽象工厂角色
//抽象工厂接口
public interface AbstractFactory {
Product getProduct();
}
具体工厂角色
//A工厂
public class AFactory implements AbstractFactory {
@Override
public Product getProduct() {
return new ConcreteProductA();
}
}
//B工厂
public class BFatory implements AbstractFactory {
@Override
public Product getProduct() {
return new ConcreteProductB();
}
}
客户端引用
public class Main {
public static void main(String[] args) {
//A产品读取
AbstractFactory abstractFactory = new AFactory();
Product productA = abstractFactory.getProduct();
productA.methodSame();
productA.methodDiff();
//B产品读取
AbstractFactory factory = new BFactory();
Product productB = factory.getProduct();
productB.methodSame();
productB.methodDiff();
}
}
工厂模式优点
1.工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节
2.它能够使工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。
3.在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。
工厂模式缺点
1.需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,增加系统开销。
2.由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
适用环境
1.客户端不需要知道它所创建的对象的类。例子中我们不知道产品具体叫什么名,只知道创建它的工厂名就完成了创建过程。
2.客户端可以通过子类来指定创建对应的对象。
网友评论