zoukankan      html  css  js  c++  java
  • 设计模式开篇——工厂模式

    作者:haibiscuit

    时间:2019:3:13

    您的star是我不断前行的动力

    https://github.com/haibiscuit

    转载请说明出处

    前言:

    1.可以先参考我写的设计原则,总的来说最重要的是要以单一职责和抽象和接口来设计自己的类,

        其中单一原则(应该仅有一个引起它变化的原因),以及模式设计的可扩展性尤为重要。

    2.为了达到开闭原则,可以将要使用的类的路径配置在xml,利用反射获取类的实例,另外需要配置的类在每个模式中只需要配置一种,

    例如:

        工厂模式:只需要配置工厂的实现类,目标类(即工厂创建的类在工厂的是喜爱呢类中创建)

        适配器模式:只需要配置适配器类,适配者在适配器类中创建,由适配器来操作

    另外,设计模式是为了建立不同类型的类之间的关系

    例如:

       工厂模式的工厂类和目标生成类(这里工厂模式有接口)

       适配器模式的适配者类和适配器类(这里适配器类也有接口)

    所以,上面的设计模式总结的思路很值得在实际的代码设计中使用

    目录:

        创建型:(重点推荐工厂模式和单例模式)

        1.工厂模式

        2.抽象工厂模式

        3.单例模式

        结构性:(重点推荐适配器模式和代理模式)

        1.适配器模式

        2.外观模式

        3.代理模式

        行为型:(重点推荐策略模式和观察者模式)

        1.命令模式

        2.迭代器模式

        3.策略模式

        4.观察者模式

    :工厂模式

        定义:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个子类的实例化延迟到其子类。

        使用场景:1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3""IMAP""HTTP",可以把这三个作为产品类,共同实现一个接口。

        示例:

            1.拿日志记录器来举例

            //创建的目标类

            interface  Logger{

                void writeLog();

            }

            class DatabaseLogger implements Logger{

                @Override

                public void writeLog() {

                   System.out.println("数据库日志记录类");

                }

            }

            class FileLogger implements Logger{

                @Override

                public void writeLog() {

                   System.out.println("文件日志记录类");

                }

            }

            //定义工厂类

            interface  LoggerFactory{

                Logger createLogger();

            }

            class DatabaseLoggerFactory implements LoggerFactory{

                @Override

                public Logger createLogger() {

                    //创建数据库日志记录器类

                    Logger logger = new DatabaseLogger();

                    return logger;

                }

            }

            class FileLoggerFactory implements LoggerFactory{

                @Override

                public Logger createLogger() {

                    //创建数据库日志记录器类

                    Logger logger = new FileLogger();

                    return logger;

                }

            }

            //测试类

            class  Test{

                public static void main(String []args){

                    LoggerFactory factory;

                    Logger logger;

                    

                    factory = new FileLoggerFactory();   //可引入配置文件实现(原理:从配置文件中获取类的路径,再通过反射类创建工厂类,为了实现开闭原则,可以在我的适配器模式中看到思路)

                    logger = factory.createLogger();

                    logger.writeLog();

                }

            }

        总结:

            1.每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

  • 相关阅读:
    团队作业开发过程
    UVM基础之--------uvm_root
    UVM基础之------uvm_transaction
    UVM基础之----uvm_object
    UVM挑战及概述
    定制UVM Messages(参考)
    SV creation order
    IC验证概念总结
    win7 硬盘安装suse双系统启动顺序更改
    suse 下的gcc安装
  • 原文地址:https://www.cnblogs.com/haibiscuit/p/10526851.html
Copyright © 2011-2022 走看看