美文网首页23天学习23种设计模式
23天学习23种设计模式——工厂方法模式

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

作者: soberbad | 来源:发表于2018-06-24 09:03 被阅读0次

    前言

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

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

    工厂方法模式(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类

    相关文章

      网友评论

        本文标题:23天学习23种设计模式——工厂方法模式

        本文链接:https://www.haomeiwen.com/subject/jpmpjxtx.html