工厂模式

工厂模式

上一节我之所以给大家说一下设计原则,那是因为我想告诉大家。不管什么原则都是有局限性的,我们之所以要学习这些设计模式。不是让你记住就行了。而是告诉大家。只有先规定了一些(需求)范围原则。我们才能设计出好的模式。我们学习这些原则就是告诉大家。根据自己实际的项目需求,来定自己的设计模式。不是说我们的项目中必须用到这些模式。哈哈哈。。。。不扯了,直接正题走起。

 

第一节我给大家讲了简单工厂模式。不错。那就是我们工厂模式中的一种,普通工厂模式。相对于工厂模式。我们可以划分三种:

1.普通工厂模式:2.多个工厂方法模式:3.静态工厂模式

下面代码直接走起:

一.普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建

首先,创建二者的共同接口:

[java] view plaincopy
public interface Sender {  
    public void Send();  
}  
其次,分别创建实现类:

[java] view plaincopy
public class MailSender implements Sender {  
    @Override  
    public void Send() {  
        System.out.println("this is mailsender!");  
    }  
}  
[java] view plaincopy
public class SmsSender implements Sender {  
  
    @Override  
    public void Send() {  
        System.out.println("this is sms sender!");  
    }  
}  
最后,建工厂类:

[java] view plaincopy
public class SendFactory {  
  
    public Sender produce(String type) {  
        if ("mail".equals(type)) {  
            return new MailSender();  
        } else if ("sms".equals(type)) {  
            return new SmsSender();  
        } else {  
            System.out.println("请输入正确的类型!");  
            return null;  
        }  
    }  
}  
我们来测试下:

public class FactoryTest {  
  
    public static void main(String[] args) {  
        SendFactory factory = new SendFactory();  
        Sender sender = factory.produce("sms");  
        sender.Send();  
    }  
}  
输出:this is sms sender!

这种例子不少,简单明了。相对于这种根据type类型来实例化不同的对象出来。其实还有一种那就是多个工厂方法模式,所谓工厂方法模式就是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

这个其实很简单的就是。我们不需要根据字符串来判断实例对象而已。直接代码走起。

二.多工厂方法模式

public class SendFactory {  
   public Sender produceMail(){  
        return new MailSender();  
    }  
      
    public Sender produceSms(){  
        return new SmsSender();  
    }  
}  
测试类如下:

[java] view plaincopy
public class FactoryTest {  
  
    public static void main(String[] args) {  
        SendFactory factory = new SendFactory();  
        Sender sender = factory.produceMail();  
        sender.Send();  
    }  
}  
输出:this is mailsender!

这种多工厂的方式,其实不足之处,就是必须明确知道那个对象才能实例化。相对于上面两种。其实我们开发中,最常用的就是,静态工厂模式

三.静态工厂模式,所谓静态工厂模式就是把将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可

public class SendFactory {  
      
    public static Sender produceMail(){  
        return new MailSender();  
    }  
      
    public static Sender produceSms(){  
        return new SmsSender();  
    }  
}  

是不是很简单,总体来说,工厂模式适合:大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。

在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

通过以上的代码我们会发现一问题。我们类的创建必须依赖工厂类。如果我们想扩展必须对工厂类进行修改,这是不是就违背六大原则中开闭原则呢。所以从设计来说,这就是问题,那么我们如何解决呢?居然是我们工厂类有问题,是不是单一职责原则,不错,我们根据依 赖倒转原则,只针对接口不针对具体哪个工厂不就行了嘛。那就是我们所说的抽象工厂。就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

四.抽象工厂模式.简单一点解释就是给工厂类一个接口去实现。以前是多个对象实例在一个工厂里面创建。现在。我要一个工厂一个实例。降低依赖,降低耦合。遵循单一职责原则。

那就是说一个实例一个工厂了,简单吧。直接代码走起。

/*
*这个是具体业务对象实现的接口
*/
public interface Sender {  
    public void Send();  
}
/*
*这是我们工厂类实现的接口
*/
public interface Provider {  
    public Sender produce();  
}    

上面我们首先定义了两个接口出来。让实体类,和工厂分别继承各自的接口。 

/*
*实现类继承接口
*/

public class MailSender implements Sender {  
    @Override  
    public void Send() {  
        System.out.println("this is mailsender!");  
    }  
}  

public class SmsSender implements Sender {  
  
    @Override  
    public void Send() {  
        System.out.println("this is sms sender!");  
    }  
}  
/*
*两个工厂类,对应实现的接口
*/
public class SendMailFactory implements Provider {  
      
    @Override  
    public Sender produce(){  
        return new MailSender();  
    }  
}  

public class SendSmsFactory implements Provider{  
  
    @Override  
    public Sender produce() {  
        return new SmsSender();  
    }  
}  

大功告成。直接测试

public class Test {  
  
    public static void main(String[] args) {  
        Provider provider = new SendMailFactory();  
        Sender sender = provider.produce();  
        sender.Send();  
    }  
}  

其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就可以了,无需去改动现成的代码。这样做,拓展性不错!哈哈哈,工厂模式就此结束,

如果感觉那里不对需要交流的。加499749405群,让我们一起努力!

 

 

 

 

 

原文地址:https://www.cnblogs.com/huojg-21442/p/6950205.html