一、概念
1、工厂方法模式概述
简单工厂模式的升级,同一个工厂类不停的增加新类型,违反单一原则和开闭原则,所以对工厂进行改造。
工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的具体类实现。
xiaomi和apple不能在同一个车间造,流程不一样
2、优点
客户端不需要再负责对象的创建,从而明确了各个类的职责,有新的对象增加,只需增加一个具体的类和具体的工厂类即可,不影响已有的代码,后期维护容易,增强了系统的扩展性
3、缺点
需要额外的编写代码,增加了工作量
二、UML图
和简单工厂模式中工厂负责生产所有对象相比,工厂方法模式将生成具体对象的任务分发给具体的工厂,其UML类图如下:
三、代码示例
产品抽象类:phone
public abstract class AbstractPhone {
public abstract void name();
}
产品一具体实现类:xiaomi phone
public class XiaoMiPhone extends AbstractPhone {
@Override
public void name() {
System.out.println("xiaomi phone");
}
}
产品二具体实现类:apple phone
public class ApplePhone extends AbstractPhone {
@Override
public void name() {
System.out.println("apple phone");
}
}
工厂接口
public interface AbstractFactory {
AbstractPhone makePhone();
}
产品一工厂具体实现类:xiaomi factory
public class XiaoMiFactory implements AbstractFactory {
@Override
public AbstractPhone makePhone() {
return new XiaoMiPhone();
}
}
产品二工厂具体实现类:apple factory
public class AppleFactory implements AbstractFactory {
@Override
public AbstractPhone makePhone() {
return new ApplePhone();
}
}
测试
public class FactoryPatternTest {
public static void main(String[] args) {
//创建工厂,工厂创建对象
AbstractPhone xiaomiPhone = new XiaoMiFactory().makePhone();
xiaomiPhone.name();
AbstractPhone applePhone = new AppleFactory().makePhone();
applePhone.name();
}
}
四、工厂模式--使用匿名内部类
工厂接口
public interface AbstractFactory {
AbstractPhone makePhone();
}
手机接口
public class ApplePhone extends AbstractPhone {
@Override
public void name() {
System.out.println("apple phone");
}
//自带工厂
public static AbstractFactory getAppleFactory= new AbstractFactory(){
@Override
public AbstractPhone makePhone() {
return new ApplePhone();
}
};
}
xiaomi手机实现
public class XiaoMiPhone extends AbstractPhone {
@Override
public void name() {
System.out.println("xiaomi phone");
}
//自带工厂
public static AbstractFactory getXiaoMiFactory= new AbstractFactory(){
@Override
public AbstractPhone makePhone() {
return new XiaoMiPhone();
}
};
}
测试
public class FactoryPatternTest {
public static void main(String[] args) {
AbstractPhone xiaoMiPhone = XiaoMiPhone.getXiaoMiFactory.makePhone();
xiaoMiPhone.name();
AbstractPhone applePhone = ApplePhone.getAppleFactory.makePhone();
applePhone.name();
}
}