(1)Java设计模式-工厂方法模式

工厂方法模式-Factory Method

  工厂方法模式一般分为三种:

              1.普通工厂模式

              2.多个工厂模式

              3.静态工厂模式

  下面将对这三种工厂模式进行解释:

    1.普通工厂模式:建立一个工厂类,对实现了同一个接口的一些类进行创建,简单的说就是创建一个类,这个类负责生产实现类同一接口的类的对象。

      

1 //共同实现的接口
2 public interface Sender {
3     void sender();
4 }
1 //发送邮件的实现类
2 public class MailSender implements Sender {
3 
4     @Override
5     public void sender() {
6         System.out.println("这是邮件发送器");
7     }
8 
9 }
1 //发送短信的实现类
2 public class MessageSender implements Sender {
3 
4     @Override
5     public void sender() {
6         System.out.println("这是短信发送器");
7     }
8 
9 }
 1 //生产实现类对象的工厂类
 2 public class Factory {
 3     public Sender produce(String type) {
 4         if (type.equals("mail")) {
 5             return new MailSender();
 6         } else if (type.equals("message")) {
 7             return new MessageSender();
 8         } else {
 9             System.out.println("输入类型不正确");
10             return null;
11         }
12     }
13 }

    以上是普通工厂所需的所有类,接下来是测试类方法

 1 public class test {
 2     public static void main(String[] args) {
 3         // 普通工厂
 4         Factory fac = new Factory();
 5         Sender object0 = fac.produce("mail");
 6         object0.sender();
 7         Sender object1 = fac.produce("message");
 8         object1.sender();
 9         Sender object2 = fac.produce("mmmm");
10         object2.sender();
11 
12     }
13 }

    接下来是运行结果:

这是邮件发送器
这是短信发送器
输入类型不正确
Exception in thread "main" java.lang.NullPointerException
    at test.main(test.java:14)

   可以发现我们通过给Factory类的produce()方法传入不同的字符参数就可以生产出不同的实现类对象,但是有一个缺点就是假如我们传入的自己参数不符合条件将会得不到对象,并且抛出异常,这就是普通工厂缺点。接下来是普通工厂的改进模式,多个工厂模式。

  2.多个方法工厂

    多个工厂模式与普通工厂唯一的区别就是把生产对象的工厂类中的方法进行拆分,使得一个方法只负责生产一种实现类对象,接下来是具体代码:

 1 //生产实现类对象的工厂类
 2 public class Factory {
 3     public Sender getMailObject() {
 4         return new MailSender();
 5     }
 6 
 7     public Sender getMassageObject() {
 8         return new MessageSender();
 9     }
10 }

   测试类方法

public class test {
    public static void main(String[] args) {
        //多个方法工厂
        Factory fac = new Factory();
        Sender object0 = fac.getMailObject();
        object0.sender();
        Sender object1 = fac.getMassageObject();
        object1.sender();
    }
}

    运行结果

这是邮件发送器
这是短信发送器

    可以看出新的工厂类省略了参数,使用多个方法分别创建对象,规避了输入错误参数可能产生的错误。但是我们发现,没错需要创建实现类对象的时候都需要创建一个工厂类的实例对象。接下来的静态工厂方法就可以省略这一步

  3.静态工厂

   静态工厂与多个方法工厂相对比,也是只改变工厂类代码如下:

 1 //静态工厂
 2 public class Factory {
 3     public static Sender getMailObject() {
 4         return new MailSender();
 5     }
 6 
 7     public static Sender getMassageObject() {
 8         return new MessageSender();
 9     }
10 }

    测试类方法

1 public class test {
2     public static void main(String[] args) {
3         // 静态工厂
4         Sender object0 = Factory.getMailObject();
5         object0.sender();
6         Sender object1 = Factory.getMassageObject();
7         object1.sender();
8     }
9 }

    运行结果

这是邮件发送器
这是短信发送器

  总的来说,但凡是出现了需要大量创建对象,且这些对象都实现的是同一个接口的时候,就可以选择通过工厂方法模式创建对象,以上三种工厂模式,大多数情况下都比较推荐静态工厂方法模式。

 

posted @ 2017-03-23 15:56  祥哥37073  阅读(190)  评论(0)    收藏  举报