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

本文介绍的是设计模式的一种——简单工厂模式

简单工厂模式简介

简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。

它是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

在简单工厂模式中,可以根据参数的不同返回不同类的实例。

简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

简单工厂模式结构图

简单工厂模式简单实现

主要角色
工厂:负责实现创建所有实例的内部逻辑,并提供一个外界调用的方法,创建所需的产品对象。
抽象产品:负责描述产品的公共接口
具体产品:描述生产的具体产品。
举个简单易懂的例子:
“假设”有一台炒菜机(工厂),可以做出各种不同的菜品(抽象产品),有三个按钮(参数)对应这三种菜品(具体产品)。
这时候你可以根据点击按钮来选择你喜欢的菜品。

步骤 1

创建抽象产品类

我们创建一个抽象产品类,他有一个抽象方法用于启动做菜:

package 软件工程作业;

public abstract class Product {
   /**
     * 产品的抽象方法,由具体的产品类去实现
      */
    public abstract void start();
}

  

步骤2

创建具体菜品类

接着我们创建各个不同的菜A、B、C,他们都继承了他们的父类Product ,并实现了父类的start方法:

package 软件工程作业;

public class Aproduct extends Product{
    @Override
    public void start() {
        System.out.println("开始做菜A");
    }
}

  

package 软件工程作业;

public class Bproduct extends Product{
    @Override
    public void start() {
        System.out.println("开始做菜B");
    }
}

  

package 软件工程作业;

public class Cproduct extends Product{
    @Override
    public void start() {
        System.out.println("开始做菜C");
    }
}package 软件工程作业;

  

步骤 3

接下来创建一个工厂类,它提供了一个静态方法cookProduct用来做菜。你只需要传入你想做的菜名,它就会实例化相应品牌的菜对象:

package 软件工程作业;

public class Factory {
    public static Product cookProduct(String type){
    	Product m=null;
        switch (type) {
            case "A":
                m=new Aproduct();
               break;
            case "B":
                m=new Bproduct();
                break;
            case "C":
                m=new Cproduct();
                break;

        }
        return m;
    }
}

步骤4

客户端调用工厂类,传入“A”生产出菜A并调用该菜的start方法:

package 软件工程作业;

public class Cookproduct {
	public static void main(String[]args){
	      Factory.cookProduct("A").start();
	}
}
终端输出结果:

优点:

  1. 符合开-闭原则:新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
  2. 符合单一职责原则:每个具体工厂类只负责创建对应的产品

缺点:

  1. 增加了系统的复杂度:类的个数将成对增加
  2. 增加了系统的抽象性和理解难度
  3. 一个具体工厂只能创建一种具体产品

在以下情况下可以使用简单工厂模式:

  • 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  • 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

解释其中用到的多态机制:

通过写一个抽象类里面有一个抽象方法,别的类继承抽象类,重写抽象类中的抽象方法实现了一种多态。

 说明模块抽象封装的方法:

利用抽象类实现。

 分析各个模块的内聚度和模块之间的耦合度:

每个不同类实现不同的抽象方法,需要什么类什么方法就加上什么类什么方法,提高了模块的内聚度,降低了模块之间的耦合度。实现了“开放-封闭”原则,这样模块更加清晰,每个部分都各司其职,分工明确,可维护性更好。




原文地址:https://www.cnblogs.com/zzydexiaowu/p/12003385.html