定义:工厂方法模式 是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。
特点:工厂方法模式是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。
抽象工厂角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
具体工厂角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
抽象产品角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
优点:工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先完全实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,可以应用于产品结果复杂的场合。
缺点:代码结构相对复杂,每增加新产品都要增加一个产品实现类和一个具体工厂。
第一步:定义产品接口
//扫描头产品接口
public interface IScanHardware {
public String getBarcode();
}
定义具体产品--霍尼、moto扫描头
//霍尼扫描头
public class Honeywell implements IScanHardware {
@Override
public String getBarcode() {
return "Honeywell_barcodeData";
}
}
//moto的扫描头
public class MOTO implements IScanHardware {
@Override
public String getBarcode() {
return "Moto_barcodeData";
}
}
//后续如果增加新的扫描头上面的代码无需改动,只需要在下面增加
//又增加新的扫描头硬件
public class NewScanHardware implements IScanHardware {
@Override
public String getBarcode() {
return "New_barcodeData";
}
}
第二步:定义抽象工厂
public interface IFactory {
public IScanBarcede create();
}
具体工厂
//moto 扫描头具体工厂实现类
public class MOTOFactory implements IFactory {
@Override
public IScanBarcede create() {
return new MOTO();
}
}
//霍尼扫描头实现类
public class HoneywellFactory implements IFactory {
@Override
public IScanBarcede create() {
return new Honeywell();
}
}
//后续如果增加其他扫描头,上面的代码不用修改。在这里增加.....
public class NewFactory implements IFactory {
@Override
public IScanBarcede create() {
return new NewScanHardware();
}
}
第三步:通过读取配置文件获取包名和类名,让后用反射获取实例对象。这样我们在增加新产品之后FactoryClient也是不需要改动。增加新产品只需要实现一个工厂类和一个产品类。
//工厂方法模式
public class FactoryClient {
public void main(){
IFactory factory;
IScanBarcede iScanBarcede;
try {
factory= new MOTOFactory();
iScanBarcede=factory.create();
if(iScanBarcede!=null)
iScanBarcede.getBarcode();
}catch (Exception ex){
}
}
}