📜  Java的工厂方法设计模式

📅  最后修改于: 2021-09-10 02:44:09             🧑  作者: Mango

它是一种创建设计模式,它讨论对象的创建。工厂设计模式说定义一个接口(一个Java接口或一个抽象类)并让子类决定实例化哪个对象。接口中的工厂方法允许一个类将实例化推迟到一个或多个具体的子类。由于这种设计模式谈论对象的实例化,因此它属于创建型设计模式的范畴。如果我们注意到名称Factory method ,那意味着有一个方法是一个工厂,通常工厂涉及创建的东西,在这里创建一个对象。这是创建对象的最佳方法之一,其中对象创建逻辑对客户端隐藏。现在让我们看一下实现。

执行:
1. 在接口内定义工厂方法。
2.让子类实现上面的工厂方法,决定创建哪个对象。
在Java,构造函数不是多态的,但是通过允许子类创建对象,我们向实例化添加了多态行为。简而言之,我们试图通过让子类决定创建什么来实现伪多态,因此这个工厂方法也被称为

虚拟构造函数。让我们尝试通过实时问题和一些编码练习来实现它。

问题陈述 :
考虑我们要通过电子邮件、短信和推送通知实现通知服务。让我们尝试在工厂方法设计模式的帮助下实现这一点。首先,我们将为此设计一个 UML 类图。

在上面的类图中,我们有一个名为Notification的接口,三个具体的类正在实现 Notification 接口。创建工厂类 NotificationFactory 以获取 Notification 对象。现在让我们开始编码。

创建通知界面

java
public interface Notification {
    void notifyUser();
}


java
public class SMSNotification implements Notification {
 
    @Override
    public void notifyUser()
    {
        // TODO Auto-generated method stub
        System.out.println("Sending an SMS notification");
    }
}


java
public class EmailNotification implements Notification {
 
    @Override
    public void notifyUser()
    {
        // TODO Auto-generated method stub
        System.out.println("Sending an e-mail notification");
    }
}


java
public class PushNotification implements Notification {
 
    @Override
    public void notifyUser()
    {
        // TODO Auto-generated method stub
        System.out.println("Sending a push notification");
    }
}


java
public class NotificationFactory {
    public Notification createNotification(String channel)
    {
        if (channel == null || channel.isEmpty())
            return null;
        if ("SMS".equals(channel)) {
            return new SMSNotification();
        }
        else if ("EMAIL".equals(channel)) {
            return new EmailNotification();
        }
        else if ("PUSH".equals(channel)) {
            return new PushNotification();
        }
        return null;
    }
}


java
public class NotificationService {
    public static void main(String[] args)
    {
        NotificationFactory notificationFactory = new NotificationFactory();
        Notification notification = notificationFactory.createNotification("SMS");
        notification.notifyUser();
    }
}


注意 – 上述接口也可以创建为抽象类。
创建所有实现类

SMSNotification.java

Java

public class SMSNotification implements Notification {
 
    @Override
    public void notifyUser()
    {
        // TODO Auto-generated method stub
        System.out.println("Sending an SMS notification");
    }
}
EmailNotification.java

Java

public class EmailNotification implements Notification {
 
    @Override
    public void notifyUser()
    {
        // TODO Auto-generated method stub
        System.out.println("Sending an e-mail notification");
    }
}
PushNotification.java

Java

public class PushNotification implements Notification {
 
    @Override
    public void notifyUser()
    {
        // TODO Auto-generated method stub
        System.out.println("Sending a push notification");
    }
}

创建一个工厂类 NotificationFactory。 Java实例化具体类。

Java

public class NotificationFactory {
    public Notification createNotification(String channel)
    {
        if (channel == null || channel.isEmpty())
            return null;
        if ("SMS".equals(channel)) {
            return new SMSNotification();
        }
        else if ("EMAIL".equals(channel)) {
            return new EmailNotification();
        }
        else if ("PUSH".equals(channel)) {
            return new PushNotification();
        }
        return null;
    }
}

现在让我们使用工厂类通过传递一些信息来创建和获取具体类的对象。

Java

public class NotificationService {
    public static void main(String[] args)
    {
        NotificationFactory notificationFactory = new NotificationFactory();
        Notification notification = notificationFactory.createNotification("SMS");
        notification.notifyUser();
    }
}
Output : Sending an SMS notification

实时示例
这种设计模式在JDK中已经被广泛使用,例如
1.的getInstance()的Java.util.Calendar,NumberFormat的,和ResourceBundle的方法使用工厂方法的设计模式。
2. Java的所有包装类,如 Integer、Boolean 等,都使用此模式使用 valueOf() 方法评估值。
3. Java.nio.charset.Charset.forName(), Java.sql.DriverManager#getConnection(), Java.net.URL.openConnection(), Java.lang.Class.newInstance(), Java.lang.Class。 forName() 是使用工厂方法设计模式的一些示例。
结论
到目前为止,我们学习了什么是工厂方法设计模式以及如何实现它。我相信现在我们对这种设计机制的优势有了一个公平的了解。