[23种设计模式][创建型]15.工厂方法模式

111 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

1.意图:

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

2.适用性:

  • 当一个类不知道它所创建的对象的类的时候。
  • 当一个类希望由它的子类指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类式代理者这一信息局部化的时候。

3.工厂方法(Factory Method)模式的构成:

  1. 产品角色(Product):定义产品的接口
  2. 具体产品角色(Concrete Product):实现接口Product的类
  3. 工厂角色(Creator):声明工厂方法(FactoryMethod),返回一个产品
  4. 具体工厂角色(ConcreteCreator):实现FactoryMethod方法,由客户调用,返回一个产品的实例

4.工厂方法模式UML类图:

Image.png

5.工厂方法模式UML时序图:

Image.png

6.代码示例:

Image.png 产品角色:

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();
    }
}