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就是具体工厂。
IteratorArrayList实现Iterable接口返回Iterator类