携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
1.意图:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
2.适用性:
- 当一个类不知道它所创建的对象的类的时候。
- 当一个类希望由它的子类指定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类式代理者这一信息局部化的时候。
3.工厂方法(Factory Method)模式的构成:
- 产品角色(Product):定义产品的接口
- 具体产品角色(Concrete Product):实现接口Product的类
- 工厂角色(Creator):声明工厂方法(FactoryMethod),返回一个产品
- 具体工厂角色(ConcreteCreator):实现FactoryMethod方法,由客户调用,返回一个产品的实例
4.工厂方法模式UML类图:
5.工厂方法模式UML时序图:
6.代码示例:
产品角色:
public interface Mobile {
void call();
}
具体产品角色1:
public class Motorola implements Mobile {
@Override
public void call() {
System.out.println("Motorola");
}
}
具体产品角色2:
public class Nokia implements Mobile {
@Override
public void call() {
System.out.println("Nokia");
}
}
工厂角色:
public interface MobileFactory {
Mobile produceMobile();
}
具体工厂角色1:
public class MotorolaFactory implements MobileFactory {
@Override
public Mobile produceMobile() {
System.out.println("Motorala 工厂制造了");
return new Motorola();
}
}
具体工厂角色2:
public class NokiaFactory implements MobileFactory {
@Override
public Mobile produceMobile() {
System.out.println("Nokia 工厂制造了");
return new Nokia();
}
}
客户角色:
public class Client {
public static void main(String[] args) {
MobileFactory factory;
Mobile mobile;
factory = new MotorolaFactory();
mobile = factory.produceMobile();
mobile.call();
System.out.println("----------");
factory = new NokiaFactory();
mobile = factory.produceMobile();
mobile.call();
}
}