欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式与应用:简单工厂模式

程序员文章站 2024-01-20 16:51:52
...

本文介绍简单工厂、使用场景

简介

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

通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类

角色和职责

  • 工厂角色(Creator):核心。负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象
  • 抽象角色(Product):工厂创建所有对象的父类。负责描述所有实例所有共有的公共接口
  • 具体产品(Concrete Product):工厂创建的具体实例对象

实现

设计模式与应用:简单工厂模式

抽象接口

package com.mym.designmodel.SimpleFactory;

/**
 * 职责:product 抽象对象
 */
public interface Animal {

    public void shout();//定义动物的喊叫方法
}

具体实例对象类1


package com.mym.designmodel.SimpleFactory;

/**
 * 职责:concreteProduct 具体对象
 */
public class Cat implements Animal{

    @Override
    public void shout() {
        System.out.println("喵喵!");
    }
}

具体实例对象类2

package com.mym.designmodel.SimpleFactory;

/**
 * 职责:concreteProduct 具体对象
 */
public class Dog implements Animal {
    @Override
    public void shout() {
        System.out.println("汪汪!");
    }
}

工厂类:这里提供两种方式生产实例。一般使用的是第一种,适应性更强。第二种虽然扩展性强,但是束缚了适应性

package com.mym.designmodel.SimpleFactory;

/**
 * 职责:简单工厂
 */
public class SimpleFactory {

    public static Animal getAnimal1(String type){
        if("dog".equalsIgnoreCase(type)){
            return new Dog();
        }else if("cat".equalsIgnoreCase(type)){
            return new Cat();
        }else{
            System.out.println("没有相应的实例对象!");
            return null;
        }
    }

    public static Animal getAnimal2(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        return (Animal) Class.forName(className).newInstance();
    }
}

测试

package com.mym.designmodel.SimpleFactory;

/**
 * 测试
 */
public class MainClass {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        Animal dog = SimpleFactory.getAnimal1("dog");
        Animal cat = SimpleFactory.getAnimal1("cat");
        dog.shout();
        cat.shout();

        System.out.println("----------------------");

        Animal dog2 = SimpleFactory.getAnimal2("com.mym.designmodel.SimpleFactory.Dog");
        Animal cat2 = SimpleFactory.getAnimal2("com.mym.designmodel.SimpleFactory.Cat");
        dog2.shout();
        cat2.shout();
    }

}

执行:

汪汪!
喵喵!
----------------------
汪汪!
喵喵!

简单工厂模式优缺点

优点

工厂类是核心。它包含必要的判断逻辑,能够根据外界给定的信息决定创建哪个具体类的对象。用户在使用时可以知己根据工厂类去创建所需实例,而无需了解这些对象如何创建如何组织。有利于整个软件体系结构的优化。

缺点

同样体现在其工厂类上,它集中所有实例的创建逻辑。所以“高内聚”方面坐的并不好。另外当系统具体产品不断增多,可能会要求工厂类也做相应的修改。扩展性不好。

使用场景

  • dao层对应各个数据库的支持

  • 可以使用在模块开发中,工厂相当于一个借口,其他使用者只管从工厂中拿对象,对相关的生产和类型由工厂的维护者或者对象的创建者维护。

计算器的简单工厂模式实现思路

(1)首先加减乘除操作在客户端写,代码冗余,并且是面向过程的思路
(2)把加减乘除操作提炼出来到一个操作工厂中。客户端只需要调用工厂中的操作方法即可,内部操作由工厂实现。

可查看:工厂方法模式