• Java之工厂方法


    普通工厂模式:

    第一步:定义接口,坚持面向接口编程,

    package dp;

    public interface Sender
    {
        public void send();
    }

    第二步:实现接口:

    package dp;

    public class MailSender implements Sender
    {
       
       public void send()
       {
            System.out.println("This is a mailsender.");
       }
    }

    package dp;

    public class SmsSender implements Sender
    {
       
        public void send()
        {
            System.out.println("This is a smssender.");
        }
    }

    第三步:创建工厂:

    package dp;

    public class SenderFactory
    {

        public Sender producer(String type)
        {
            if( type.equals("mail"))
            {
                return new MailSender();
            }
            else if(type.equals("sms"))
            {
                return new SmsSender();
            }
            else
            {
                System.out.println("你输入的类型不正确!");
                return null;
            }
        }
    }

    第四步:测试工厂,

    package dp;

    public class FactoryTest
    {
        public static void main(String[] args)
        {
            SenderFactory sf = new SenderFactory();
            Sender sender = sf.producer("sm");
            sender.send();
        }
    }

    输出信息:

    Exception in thread "main" java.lang.NullPointerException
        at dp.FactoryTest.main(FactoryTest.java:9)
    你输入的类型不正确!
    Process exited with exit code 1.

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

    上例子:

    package factorymethod;

    public interface Receiver
    {
        public void receive();
    }

    package factorymethod;

    public class QqReceiver implements Receiver
    {
        public void receive()
        {
            System.out.println("通过QQ接收信息");
        }
    }

    package factorymethod;

    public class MobileReceiver implements Receiver
    {
        public void receive()
        {
            System.out.println("通过手机接收信息");
        }
    }

    package factorymethod;

    public class ReceiverFactory
    {
        public Receiver produceQqReceiver()
        {
            return new QqReceiver();
        }
        
        public Receiver produceMobileReceiver()
        {
            return new MobileReceiver();
        }
    }

    package factorymethod;

    public class FactoryTest
    {
        public static void main(String[] args)
        {
            //记得从工厂取对象
            ReceiverFactory rf = new ReceiverFactory();
            //取什么对象,此处取手机接收信息
            Receiver mobileRev = rf.produceMobileReceiver();
            mobileRev.receive();
        }
    }

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

    package factorymethod;

    public interface Receiver
    {
        public void receive();
    }

    package factorymethod;

    public class QqReceiver implements Receiver
    {
        public void receive()
        {
            System.out.println("通过QQ接收信息");
        }
    }

    package factorymethod;

    public class MobileReceiver implements Receiver
    {
        public void receive()
        {
            System.out.println("通过手机接收信息");
        }
    }

    package factorymethod;

    public class ReceiverFactory
    {
        public static Receiver produceQqReceiver()
        {
            return new QqReceiver();
        }
        
        public static Receiver produceMobileReceiver()
        {
            return new MobileReceiver();
        }
    }


    package factorymethod;

    public class FactoryTest
    {
        public static void main(String[] args)
        {
            //记得从工厂取对象
            //取什么对象,此处取QQ接收信息
            Receiver QqRev = ReceiverFactory.produceQqReceiver();
            QqRev.receive();
        }
    }

    抽象工厂模式:

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

    package abstractfactory;

    public interface Sender
    {
        public void send();
    }

    package abstractfactory;

    public class SmsSender implements Sender
    {
        public void send()
        {
            System.out.println("短信发送!");
        }
    }
    此处定义一个生产者接口,用于产生各种工厂类:

    package abstractfactory;

    public interface Provider
    {
        public Sender produce();
    }


    在此我们实现工厂类

    package abstractfactory;

    public class SmsSenderFactory implements Provider
    {
        public Sender produce()
        {
            return new SmsSender();
        }
    }

    package abstractfactory;

    public class AbstractFactoryTest
    {
        public static void main(String[] args)
        {
            Provider smsProvider = new SmsSenderFactory();
            Sender smsSender = smsProvider.produce();
            smsSender.send();
        }
    }

    问题来了,我们现在要增加一个 mail发送的功能,先来的点理论:

    设计模式的六大原则

    1、开闭原则(Open Close Principle)

    开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

    2、里氏代换原则(Liskov Substitution Principle)

    里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里 氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现 抽象化的具体步骤的规范。—— From Baidu 百科

    3、依赖倒转原则(Dependence Inversion Principle)

    这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。

    4、接口隔离原则(Interface Segregation Principle)

    这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

    5、迪米特法则(最少知道原则)(Demeter Principle)

    为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

    6、合成复用原则(Composite Reuse Principle)

    原则是尽量使用合成/聚合的方式,而不是使用继承。

    为了系统的稳定性,最好不要修改原来的类和方法,要不违反开闭原则,有了抽象工厂方法模式的基础,我们来实现mail发送的功能。

    先实现Sender接口:

    package abstractfactory;

    public class MailSender implements Sender
    {
        public void send()
        {
            System.out.println("用邮件发送!");
        }
    }

    然后实现,provider接口:

    package abstractfactory;

    public class MailSenderFactory implements Provider
    {
        public Sender produce()
        {
            return new MailSender();
        }
    }

    测试:

    package abstractfactory;

    public class AbstractFactoryTest
    {
        public static void main(String[] args)
        {
            Provider smsProvider = new SmsSenderFactory();
            Sender smsSender = smsProvider.produce();
            smsSender.send();
            
            Provider mailProvider = new MailSenderFactory();
            Sender mailSender = mailProvider.produce();
            mailSender.send();
        }
    }
    短信发送!
    用邮件发送!

  • 相关阅读:
    补货知识要点解析
    【解析】ABC与CVA分析法
    【进阶】安全库存与动态平衡
    【知识】可用于仓储数据分析的4类方法
    浅析VMI(供应商库存管理)的实施条件与原则
    补货分类与策略要点
    仓库运营效率提升手册(简版)
    WinForm嵌入Web网站 逝年
    如何将本地项目上传到gitlab IT
    oracle数据库exp和imp的使用
  • 原文地址:https://www.cnblogs.com/herosoft/p/5120946.html
Copyright © 2020-2023  润新知