• 工厂设计模式


    本文章,摘抄自:2018黑马程序最新面试题汇总

    工厂模式分为:工厂方法模式和抽象工厂模式。

    工厂方法模式分为三种:

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

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

    静态工厂方法模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

    普通工厂模式:

    1 public interface ISender {
    2 
    3     public void Send();
    4 }
    1 public class MailSender implements ISender {
    2 
    3     @Override
    4     public void Send() {
    5         System.out.println("this is mail sender");
    6     }
    7 
    8 }
    1 public class SmsSender implements ISender {
    2 
    3     @Override
    4     public void Send() {
    5         System.out.println("this is sms sender");
    6     }
    7 
    8 }
     1 public class SendFactoryCommon {
     2     public ISender produce(String type) {
     3         if ("mail".equals(type)) {
     4             return new MailSender();
     5         } else if ("sms".equals(type)) {
     6             return new SmsSender();
     7         } else {
     8             System.out.println("请输入正确的类型!");
     9             return null;
    10         }
    11     }
    12 }

    测试方法:

    1 @Test
    2     public void testCommon() {
    3         SendFactoryCommon factory = new SendFactoryCommon();
    4         ISender sender = factory.produce("mail");
    5         sender.Send();
    6     }

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

    import cn.silence.face.designmode.factory.common.ISender;
    import cn.silence.face.designmode.factory.common.MailSender;
    import cn.silence.face.designmode.factory.common.SmsSender;
    
    public class SendFactoryMore {
        public ISender produceMail() {
            return new MailSender();
        }
    
        public ISender produceSms() {
            return new SmsSender();
        }
    }

    测试方法:

    1 @Test
    2     public void testMore() {
    3         SendFactoryMore factory = new SendFactoryMore();
    4         ISender sender = factory.produceMail();
    5         sender.Send();
    6     }

    静态工厂方法模式:将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

     1 import cn.silence.face.designmode.factory.common.ISender;
     2 import cn.silence.face.designmode.factory.common.MailSender;
     3 import cn.silence.face.designmode.factory.common.SmsSender;
     4 
     5 public class SendFactoryDyanmic {
     6     public static ISender produceMail() {
     7         return new MailSender();
     8     }
     9 
    10     public static ISender produceSms() {
    11         return new SmsSender();
    12     }
    13 }

    测试方法:

    1 @Test
    2     public void testDyanmic() {
    3         ISender sender = SendFactoryDyanmic.produceMail();
    4         sender.Send();
    5     }

    抽象工厂模式:工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂

    类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

    1 import cn.silence.face.designmode.factory.common.ISender;
    2 
    3 public interface IProvider {
    4     public ISender produce();
    5 }
     1 import cn.silence.face.designmode.factory.common.ISender;
     2 import cn.silence.face.designmode.factory.common.MailSender;
     3 
     4 public class SendMailFactory implements IProvider {
     5 
     6     @Override
     7     public ISender produce() {
     8         return new MailSender();
     9     }
    10 
    11 }
     1 import cn.silence.face.designmode.factory.common.ISender;
     2 import cn.silence.face.designmode.factory.common.SmsSender;
     3 
     4 public class SendSmsFactory implements IProvider {
     5 
     6     @Override
     7     public ISender produce() {
     8         return new SmsSender();
     9     }
    10 
    11 }

    测试方法:

    1 @Test
    2     public void testAbs() {
    3         IProvider provider = new SendMailFactory();
    4         ISender sender = provider.produce();
    5         sender.Send();
    6     }
  • 相关阅读:
    4-18
    Vue学习 2017-4-9
    前端杂谈
    不错的博客哦!
    待整理知识杂项
    Vue学习历程
    王工的权限理解
    【NX二次开发】图标图像
    【转】C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.
    获取计算机名
  • 原文地址:https://www.cnblogs.com/ffeiyang/p/9542538.html
Copyright © 2020-2023  润新知