zoukankan      html  css  js  c++  java
  • OOAD-14 五大创建模式之--工厂方法模式

    前言

      在上文提到的简单工厂模式中,发现简单工厂模式存在一系列问题:

        工厂类集中了所有产品的创建逻辑,一旦这个工厂类不能正常工作,整个系统都会受到巨大的影响。

        违背开闭原则。一旦添加新产品时,不是通过新增类解决,而是通过修改原先的工厂类逻辑来解决。这样会造成工厂类静态工厂方法逻辑过于复杂。

        简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。

      为了解决上述的问题,我们又使用了一种新的设计模式:工厂方法模式

    工厂方法模式的定义

      工厂方法模式,又称工厂模式、多态工厂模式。通过定义父类工厂负责定义创建对象的公共接口,而子类则负责生成具体的对象。

    工厂方法模式的作用

      将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成。(简单工厂模式中,是将具体产品的创建延迟到具体产品子类中去创建)既由具体工厂来决定应该实例话哪一种产品。

      工厂模式方法将具体产品的创建过程延迟到工厂类的子类中。此时工厂类不再负责所有产品的创建逻辑。而是仅仅给出具体工厂必须实现的接口。这样在新增产品的时候。就不需要更改抽象工厂类。而是只需要新增新的工厂实现子类就可以了。符合了开闭原则。克服了简单工厂模式的缺点

    工厂模式的UML

      这里写图片描述

    工厂模式使用步骤

      创建抽象工厂类,定义具体工厂的公共接口

      创建抽象产品类,定义具体产品的公共接口

      创建具体产品类,定义生产的具体产品

      创建具体接口类,重写抽象工厂类的公共接口来创建不同的具体产品类

      外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

    工厂方法模式优点

      更符合开闭原则。新增一种产品时,只需要添加相应的具体产品类和相应的工厂子类即可。而简单工厂模式需要修改工厂类的判断逻辑

      符合单一职责原则,每个具体工厂类只负责创建对应的产品。而简单工厂模式中的工厂类存在复杂的switch-case 或者 if-else逻辑判断

      不使用静态工厂方法,可以形成基于继承的等级结构。而简单工厂模式中的工厂类使用的是静态工厂方法。

      工厂模式可以说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优点的同时,让扩展变得简单,让继承变得可行,增加了多态性的体现。

    工厂方法模式的应用常见场景 

      在一个类不知道他所需要的对象的类时。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可。

      当一个类希望通过其子类来制定创建对象时。在工厂方法模式中,抽象工厂类只需要提供一个创建产品的接口,返回的抽象产品父类。而由其子类来确定要创建的具体产品对象。多态,易拓展。

      将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类。需要时再动态指定,可将具体工厂类的类名存在在配置文件或者数据库中。通过反射中的newInstance创建对象。

    工厂方法模式的缺点 

      添加一个新产品就得添加一个具体的工厂类。系统类的个数将成对增加。一定程度上增加了系统的复杂度和开销

      一个具体工厂只能创建一种具体产品

    代码实例

    package com.dding.pmsmigrateServer.test;
    
    //客户端
    public class Test {
        public static void main(String[] args) {
    
        }
    }
    //定义抽象工厂
    interface AbstractFactory{
        AbstractProduct getProduct();
    }
    
    //定义抽象产品类
    interface AbstractProduct{
        void show();
    }
    
    //定义具体产品子类apple
    class Apple implements AbstractProduct{
        public void show(){
            System.out.println("apple");
        }
    }
    
    //定义具体产品子类monce
    class Mouce implements AbstractProduct{
        public void show(){
            System.out.println("monce");
        }
    }
    
    //定义具体的产品子类cat
    class Cat implements AbstractProduct{
        public void show(){
            System.out.println("cat");
        }
    }
    
    //定义生产apple的工厂子类
    class AppleFactory implements AbstractFactory{
        public AbstractProduct getProduct(){
            return new Apple();
        }
    }
    
    //定义生产mouce的工厂子类
    class MonceFactory implements AbstractFactory{
        public AbstractProduct getProduct(){
            return new Mouce();
        }
    }                                                                                    
          
  • 相关阅读:
    .net jquery ajax应用(后台)
    .net jquery ajax应用(前端)
    echarts 添加Loading 等待。
    js将数字转换为带有单位的中文表示
    关于Pre-bound JDBC Connection found! HibernateTransactionManager does not 异常小结
    java 并发容器一之ConcurrentHashMap(基于JDK1.8)
    java 并发容器一之BoundedConcurrentHashMap(基于JDK1.8)
    23中java设计模式(1)-- 策略模式
    解决Eclipse自动补全变量名的问题
    Tomcat+Jenkins+SonarQube+SVN+Maven 集成自动化环境搭建(Windows10环境下)
  • 原文地址:https://www.cnblogs.com/exceptionblog/p/11065260.html
Copyright © 2011-2022 走看看