首页 > 其他 > 详细

案例分析:设计模式与代码的结构特性

时间:2019-12-08 14:55:18      阅读:107      评论:0      收藏:0      [点我收藏+]

一、工厂模式的特点

  工厂模式核心是封装对象的创建接口,将new对象的操作封装起来,方便创建使用、管理对象。

  工厂模式实现了解耦、降低代码重复、减少错误的作用。

     解耦:把对象的创建和使用的过程分开。就是Class A 想调用Class B,那么只是调用B的方法,而至于B的实例化,就交给工厂类。

     降低代码重复:如果创建B过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。

           可以把这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的维护。

     减少错误:因为工厂管理了对象的创建逻辑,使用者不需要知道具体的创建过程,只管使用即可,

         减少了使用者因为创建逻辑导致的错误。

二、工厂模式分类

  工厂模式大体分为简单工厂、工厂方法、抽象工厂等三种模式。

  简单工厂:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(继承自一个父类或接口)的实例。

       优点:将创建使用工作分开,不必关心类对象如何创建,实现了解耦;
       缺点:违背“开放 - 关闭原则”,一旦添加新产品就不得不修改工厂类的逻辑,这样就会造成工厂逻辑过于复杂。

  工厂方法:定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象

               优点:符合开-闭原则:新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可;

          符合单一职责原则:每个具体工厂类只负责创建对应的产品

       缺点:增加了系统的复杂度:类的个数将成对增加;

          增加了系统的抽象性和理解难度;一个具体工厂只能创建一种具体产品

  抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类;具体的工厂负责实现具体的产品实例。

       优点:降低耦合;符合开-闭原则;符合单一职责原则;不使用静态工厂方法,可以形成基于继承的等级结构。

       缺点:难以扩展新种类产品

三、工厂模式的一些适用场景:

   1.对象的创建过程/实例化准备工作很复杂,需要很多初始化参数,查询数据库等

   2.类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变

四、案例分析

  以工厂方法进行代码设计

  工厂方法模式由四个角色类组成:

    抽象工厂类:定义工厂类的方法,用来创建产品类

    具体工厂类:用于创建对应的产品对象

    抽象产品类:定义产品了公共的属性、方法

    具体产品类:实现对应产品类的属性、方法

  它们之间的UML关系图如下:

 技术分享图片

  

  定义产品类对象:

 

/**
 * 定义一个电脑的实体
 * @author 13761
 */

abstract class Computer {
    /**
     * 定义电脑的特性,都能用来打游戏
     */
    public abstract void play();
}

class Desktop extends Computer{
    private String name = "";

    public Desktop(String name){
        this.name = name;
    }

    @Override
    public void play() {
        System.out.println("使用 "+ name+" 畅玩3A大作");
    }

}

class Laptop extends Computer{
    private String name = "";
    public Laptop(String name){
        this.name = name;
    }

    @Override
    public void play() {
        System.out.println("使用 "+ name+" 享受4399小游戏");
    }
}

 

  定义工厂类:

/**
 * 定义抽象工厂类,来定义所有工厂应该具备的职责,通性。
 * @author 13761
 *
 */
abstract class ComputerFactory {
    public abstract Computer createComputer();
}

class DesktopFactory extends ComputerFactory{

    @Override
    public Computer createComputer() {
        return new Desktop("台式电脑");
    }
}

class LaptopFactory extends ComputerFactory{

    @Override
    public Computer createComputer() {
        return new Laptop("笔记本电脑");
    }

}

 

  定义测试类:

/**
 * 测试
 * @author 13761
 */
public class MethodFactoryClient {

    /**
     * 工厂方法模式,根据需要,直接创建对象。方便扩展。无用改变Factory类代码,只需要新增。
     * @param args
     */
    public static void main(String[] args) {
        DesktopFactory desktopFactory = new DesktopFactory();
        Computer desktop = desktopFactory.createComputer();
        desktop.play();

        LaptopFactory laptopFactory = new LaptopFactory();
        Computer laptop = laptopFactory.createComputer();
        laptop.play();
    }
}

 

  输出结果:

技术分享图片

 

代码链接:https://github.com/13761174936/code/tree/master/src

 

 

 

 

案例分析:设计模式与代码的结构特性

原文:https://www.cnblogs.com/baozhw/p/12005225.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!