设计模式之二--工厂方法模式

前言

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

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

工厂方法模式(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);
    }


}

运行结果




链接:https://www.jianshu.com/p/83ab6dcb14f1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值