针对简单工厂违背开闭原则,设计模式中引入了工厂方法模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行
UML图:
- 通过抽象类的方式定义Phone,并定义抽象方法produce
- 通过接口的方式定义PhoneFactory,并定义接口方法getPhone
- 通过继承抽象类Phone定义ApplePhone,并覆盖重写抽象方法produce进行具体产品的生产
- 通过实现接口PhoneFactory定义ApplePhoneFactory,并覆盖重写接口方法getPhone返回具体对象
- 通过实现接口PhoneFactory定义HuaweiPhoneFactory,并覆盖重写接口方法getPhone返回具体对象
- 定义测试类Test创建ApplePhoneFactory和HuaweiPhoneFactory进行测试
代码:
//Phone抽象类
public abstract class Phone {
abstract void produce();
}
//PhoneFactory接口
public interface PhoneFactory {
Phone getPhone();
}
//通过继承抽象类定义ApplePhone
public class ApplePhone extends Phone {
@Override
void produce() {
System.out.println("生产苹果手机");
}
}
//通过实现接口定义ApplePhoneFactory
public class ApplePhoneFactory implements PhoneFactory {
@Override
public Phone getPhone() {
return new ApplePhone();
}
}
//通过继承抽象类定义HuaweiPhone
public class HuaweiPhone extends Phone {
@Override
void produce() {
System.out.println("生产华为手机");
}
}
//通过实现接口定义HuaweiPhoneFactory
public class HuaweiPhoneFactory implements PhoneFactory {
@Override
public Phone getPhone() {
return new HuaweiPhone();
}
}
//Test测试类
public class Test {
public static void main(String[] args) {
PhoneFactory phoneFactory= new ApplePhoneFactory();
phoneFactory.getPhone().produce();
PhoneFactory phoneFactory1 = new HuaweiPhoneFactory();
phoneFactory1.getPhone().produce();
}
}
总结:
工厂方法模式是简单工厂模式的衍生,遵循设计模中的“开闭”原则。在工厂方法模中有一个抽象的Factory类(可以是抽象类也可以是接口),这个类将不再负责具体的产品生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品