23天学习23种设计模式

23天学习23种设计模式——工厂方法模式

2018-06-24  本文已影响0人  soberbad

前言

在生活中,相信大家对工厂也不会陌生。就拿大家经常用的手机举例,不管是苹果,三星,小米还是华为。都是由各家的工厂或者代工厂生产出来的。经过线上或者线下的销售途径到达我们消费者手中。作为消费者,并不需要也不关心手机是如何生产出来的,因为这些都是各家工厂负责的。而在程序设计中,同样有类似的设计模式——工厂方法模式。

是什么(什么是工厂方法模式)

工厂方法模式(Factory Method Pattern)是一种对象创建型设计模式(又叫做工厂模式,虚拟构造器模式或多态工厂模式)。它定义一个用于创建对象的接口,然后让子类决定实例化哪个类。工厂方法模式让一个类的实例化延迟到了它的子类。

为什么 (为什么要用工厂方法模式)

想得到某些类的对象,又无需知道创建类的具体类别。也不知道它的创建以及初始化过程。(在维基百科中,原文是这么解释的: to deal with the problem of creating objects without having to specify the exact class of the object that will be created.)

怎么用 (怎么实现工厂方法模式)

上图是工厂方法模式的UML结构图,下面通过一个表格分别解释每个角色的作用:

角色 作用
Product(抽象产品) 定义产品的接口,是产品对象的父类
ConcreteProduct(具体产品) 实现抽象产品接口,具体产品由具体工厂创建,并与其一一对应
Factory(抽象工厂) 声明了工厂方法,返回一个产品,是工厂对象的父类
ConcreteFactory(具体工厂) 抽象工厂的子类,实现了工厂方法,并由客户端调用,返回一个具体产品的对象

就以前面提到的手机举例:

public interface Phone {

    String brand();

    void call(String from,String to);


}

public interface PhoneFactory {

    Phone createPhone();

}

public class ApplePhone implements Phone {
    @Override
    public String brand() {
        return "Apple";
    }

    @Override
    public void call(String from, String to) {
        System.out.println(String.format("苹果手机正在拨打电话,本机号码为:%s,被叫号码为:%s",from,to));
    }
}

public class AppleFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        AppleiPhone phone = new AppleiPhone();
        //初始化工作:如组装
        return phone;
    }
}


public class XiaoMiPhone implements Phone {
    @Override
    public String brand() {
        return "Xiaomi";
    }

    @Override
    public void call(String from, String to) {
        System.out.println(String.format("小米手机正在拨打电话,本机号码为:%s,被叫号码为:%s",from,to));
    }
}

public class XiaomiFactory implements PhoneFactory {
    @Override
    public Phone createPhone() {
        XiaoMiPhone phone = new XiaoMiPhone();
        //初始化工作:如组装
        return phone;
    }
}



public class Client {

    public static void main(String[]args) {

        PhoneFactory factory = new AppleFactory();
        Phone phone = factory.createPhone();

        System.out.println(phone.brand());

        String myPhoneNumber = "13812340000";
        String myFriendPhoneNumber = "13912348888";
        phone.call(myPhoneNumber, myFriendPhoneNumber);

        factory = new XiaomiFactory();
        Phone xiaoMiPhone = factory.createPhone();

        System.out.println(xiaoMiPhone.brand());
        xiaoMiPhone.call(myPhoneNumber,myFriendPhoneNumber);
    }


}

运行结果

运行结果

在Android源码中的应用

JDK中的Collection集合类中,就有工厂方法模式的应用。如下图所示:比如我们经常用的Iterator。Iterator就是抽象产品,Itr就是具体产品。Iterable是抽象工厂,ArrayList就是具体工厂。

Iterator
ArrayList实现Iterable接口返回Iterator类
上一篇下一篇

猜你喜欢

热点阅读