设计模式开篇——工厂模式

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

原文地址:https://www.cnblogs.com/haibiscuit/p/10526851.html