• JAVA设计模式(二)——工厂模式


    工厂模式就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建,将创建对象的过程交给工厂类(我们举一个发送邮件和短信的例子):

    模式名称 优点   缺点 使用场景
    简单工厂模式 外界不需要创建对象,只需要消费即可 工违反了高内聚责任分配原则,如果需要添加新的类,则就需要改变工厂类了。

    ①工厂类负责创建的对象比较少

    ②客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心

    工厂方法模式  新增产品,不需要改动之前工厂类,只需新增工厂类 实现多个产品接口时,难以处理  日志记录器
    抽象工厂模式

     当一个产品族中的多个对象被设计成一起工作时,

    它能保证客户端始终只使用同一个产品族中的对象。

     扩展非常困难

     1、QQ 换皮肤,一整套一起换。

     2、生成不同操作系统的程序

     

     

    首先定义一个接口类Sender,并创建2个实现类实现Sender接口,代码如下:

    public interface Sender {
        void Send();
    }
    
    // 邮件发送
    public class MailSender implements Sender {
        public void Send() {
            System.out.println("this is MailSender");
        }
    }
    
    // 短信发送
    public class SmsSender implements Sender {
        public void Send() {
            System.out.println("this is SmsSender");
        }
    }

    简单工厂模式:创建工厂类ManySendFactory

    ①普通简单工厂模式:

    public class SendFactory {
        // 根据传入类型,去获取对应的实列
        public Sender getSender(String type) {
            if ("mail".equals(type)) {
                return new MailSender();
            } else if ("sms".equals(type)) {
                return new SmsSender();
            }
            return null;
        }
    }
    //使用方法:
    SendFactory factory = new SendFactory(); //创建工厂类
    Sender sender = factory.getSender("sms"); // 根据类型获取对应实列
    sender.Send();

    ②多方法简单工厂模式:在普通工厂方法模式中,如果传递的类型出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象。

    public class ManySendFactory {
    
        public Sender getMailSender() {
    
            return new MailSender();
        }
    
        public  Sender getSmsSender() {
    
            return new SmsSender();
        }
    }
    
    // 测试
    ManySendFactory manySendFactory = new ManySendFactory();
    Sender mailSender = manySendFactory.getMailSender();
    mailSender.Send();

    ③静态方法简单工厂模式:讲多方法模式中的所有方法改成静态的,方便调用

    public class StaticSendFactory {
    
        public static Sender getMailSender() {
    
            return new MailSender();
        }
    
        public static Sender getSmsSender() {
    
            return new SmsSender();
        }
    }
    // 测试
    Sender smsSender = StaticSendFactory.getSmsSender();
    smsSender.Send();

    工厂方法模式:新增工厂接口Factory,并创建SenderFactory和SmsFactory实现Factory接口,通过指定factory类型去创建(该模式是抽象工厂模式的一种特列)

    // Factory接口
    public interface Factory {
    
        Sender createSender();
    }
    
    // SmsFactory实现Fatory
    public class SmsFactory implements Factory {
    
        @Override
        public Sender createSender() {
            return new SmsSender();
        }
    }
    
    // EmailFactory实现Fatory
    public class EmailFactory implements Factory {
    
        @Override
        public Sender createSender() {
            return new EmailSender();
        }
    }

     测试:根据指定不同工厂获取对应对象

      public static void main(String[] args) {
            Factory factory = new SmsFactory();
            factory.createSender().Sender(); // 输出this is SmsSender
            
            Factory factory1 = new EmailFactory();
            factory1.createSender().Sender();// 输出this is EmailSender
        }

    抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

      ①将多个工厂类抽象出一个抽象类

      ②每个工厂类继承该抽象类

      ③创建一个工厂创造器/生成器类,通过传入类型去获取对应工厂方法,再通过获取出的工厂类获取实列对象。

      

  • 相关阅读:
    POJ 1182 食物链 并查集
    POJ 3666 Making the Grade DP
    POJ 1631 Bridging signals DP(最长上升子序列)
    POJ 1065 Wooden Sticks / hdu 1257 最少拦截系统 DP 贪心
    利用UUID 随机生成8位短号
    JS遍历子孙树
    前端中this的用法
    利用fetch进行POST传参
    SQL UNION 操作符
    Python 抖音机器人,论如何在抖音上找到漂亮小姐姐?
  • 原文地址:https://www.cnblogs.com/zblwyj/p/13645901.html
Copyright © 2020-2023  润新知