工厂方法(Factory Method)
程序员文章站
2022-06-15 14:11:43
...
工厂方法(Factory Method) 在工作中的也是很常见的。
使用场景:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。
特点:
1,被创建对象的类实现共同的接口(程序运行时期动态绑定具体哪个类)
2,工厂:提供创建对象的方法(根据不同的标示,或者提供不同的方法对不同的类进行创建)
3,client:持有工厂或者调用工厂不同的静态方法实现对不同类型的类进行实例化。
工厂方法有三种变形普通工厂,多方法工厂,静态工厂
在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,
所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
缺点:如果添加一个被创建的类必须要修改工厂类,添加一个新的方法
UML类图:
实现:
/**
* 被创建的类实现的接口
*/
public interface Sender {
public void send();
}
public class SmsSender implements Sender {
@Override
public void send() {
System.out.println("sms send method");
}
}
public class MailSender implements Sender {
@Override
public void send() {
System.out.println("mail send method");
}
}
/**
* 普通工厂
*/
public class SendFactory {
/**
* 通过传入的type进行判断具体需要实例化哪个类
*/
public Sender produce(String type){
Sender sender=null;
if("mail".equals(type)){
sender = new MailSender();
}else if("sms".equals(type)){
sender = new SmsSender();
}else{
System.out.println("没有此类型");
}
return sender;
}
}
/**
* 多方法工厂
*/
public class SendFactory2 {
//为每一个类创建一个实例化的方法
public Sender produceMail(){
return new MailSender();
}
public Sender produceSms(){
return new SmsSender();
}
}
/**
* 静态工厂
*/
public class SendFactory3 {
public static Sender produceMail(){
return new MailSender();
}
public static Sender produceSms(){
return new SmsSender();
}
}
/**
* Created by lyyz on 2017/7/12.
*/
public class FactoryTest {
public static void main(String[] args) {
//普通工厂模式
SendFactory sendFactory = new SendFactory();
Sender sender = sendFactory.produce("mail");
sender.send();
//多方法工厂模式
SendFactory2 sendFactory2 = new SendFactory2();
Sender sender2 = sendFactory2.produceMail();
sender2.send();
//静态工厂模式
Sender sender3 = SendFactory3.produceMail();
sender3.send();
}
}
推荐阅读
-
iOS应用设计模式开发中对简单工厂和工厂方法模式的运用
-
php采用curl访问域名返回405 method not allowed提示的解决方法
-
PHP设计模式之工厂模式(Factory)入门与应用详解
-
Android源码学习之工厂方法模式应用及优势介绍
-
Python设计模式之工厂方法模式实例详解
-
Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】
-
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
-
innodb_flush_method取值方法(实例讲解)
-
C# 设计模式系列教程-工厂方法模式
-
C#基于Extension Method(扩展方法)获得文件大小的方法