设计模式篇(三)—— 工厂模式及抽象工厂模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Michael_HM/article/details/81633384

1.工厂模式基本介绍

工厂模式概念:

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂模式,主要实现了创建者和调用者的分离。

  分类:1、简单工厂模式;2、工厂方法模式;3、抽象工厂模式。

  核心:实例化对象时,用工厂方法代替new操作。

2.简单工厂模式

  工厂类作为类使用,产品类作为接口使用,具体产品实现接口,用来生产同一等级结构中的任意产品,当新增产品时,需要修改已有的代码。

/**
 * 产品类接口
 */
public interface Sender {
   
   /**
    * 发送
    */
   void send();
​
}
/**
 * 具体产品实现接口
 */
public class EmailSender implements Sender{
​
   @Override
   public void send() {
      System.out.println("邮件发送...");
   }
​
}
/**
 * 具体产品实现接口
 */
public class WXSender implements Sender{
​
   @Override
   public void send() {
      System.out.println("微信发送...");
   }
   
}
/**
 * 简单工厂模式
 * 产品工厂类
 * @author merlin
 *
 */
public class SimpleMethodFactory {
​
   public Sender produce(String type){
      if("email".equals(type)){
         return new EmailSender();
      }else if("wx".equals(type)){
         return new WXSender();
      }else{
         System.out.println( "请选择正确的发送类型!");
         return null;
      }
         
   }
}
//简单工厂模式测试
SimpleMethodFactory simpleFactory = new SimpleMethodFactory();
Sender sender = simpleFactory.produce("wx");
sender.send();

测试结果:

微信发送...

3.多个方法工厂模式

是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

扫描二维码关注公众号,回复: 3017855 查看本文章
/**
 * 多个方法工厂模式
 * @author merlin
 *
 */
public class MoreMethodFactory {
​
    //email发送
    public Sender produceEmail(){
        return new EmailSender();
    }
    
    //微信发送
    public Sender produceWX(){
        return new WXSender();
    }
}
//多个方法工厂模式测试
MoreMethodFactory moreFactory = new MoreMethodFactory();
Sender produceEmail = moreFactory.produceEmail();
produceEmail.send();

测试结果:

邮件发送...

4.静态工厂方法模式

将多方法工厂方法模式里的方法写成静态的,不需要创建实例,直接调用即可。

/**
 * 静态方法工厂模式
 * @author merlin
 *
 */
public class StaticMethodFactory {
    
    public static Sender produceEmail(){
        return new EmailSender();
    }
    
    public static Sender produceWX(){
        return new WXSender();
    }
}
//静态方法工厂模式测试
Sender sender2 = StaticMethodFactory.produceEmail();
sender2.send();

测试结果:

邮件发送...

总结:

当有大量拥有共同接口(属性)的对象时,我们可以通过工厂方法模式进行创建,在以上的三种模式中,第一种如果传入的字符串有误,不能正确吃黄建对象,第三种相对于第二种,不需要实例化工厂对象,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

5.抽象工厂模式

5.1 介绍

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

保留上述发送接口,以及邮件发送和微信发送实例不变,创建其工厂的抽象接口:

/**
 * 工厂抽象接口
 */
public interface Provider {
​
   public Sender produce();
   
}
/**
 * 发送邮件工厂类
 * @author merlin
 *
 */
public class SendEmailFactory implements Provider{
   
   @Override
   public Sender produce() {
      return  new EmailSender();
   }
​
}
/**
 * 发送微信工厂类
 * @author merlin
 *
 */
public class SendWXFactory implements Provider{
   
   @Override
   public Sender produce() {
      return  new WXSender();
   }
   
}

测试:

/**
 * 抽象工厂模式测试类
 * 工厂方法模式有一个问题,就是类的创建以来工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,就一定有问题
 * 这时候用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码.
 * @author melrin
 *
 */
public class AbstractFactoryTest {
   
   public static void main(String[] args) {
      Provider provider = new SendWXFactory();
      Sender sender = provider.produce();
      sender.send();
   }
}

6.区别

工厂方法模式与抽象工厂模式最大的区别在于,在工厂方法模式中,工厂创造的是一个产品(就是代码中的工厂类),而在抽象工厂模式中,工厂创造的是一个产品族就是代码中的工厂的接口

猜你喜欢

转载自blog.csdn.net/Michael_HM/article/details/81633384