创建模式之简单工厂

六个创建型模式

  1. 简单工厂模式 -Simple Factory Pattern
  2. 工厂方法模式 -Factory Method Pattern 
  3. 抽象工厂模式 -Abstract Factory Pattern
  4. 单例模式 -Single Pattern
  5. 原型模式 -Prototype Pattern
  6. 建造者模式 -Builder Pattern

工厂模式简介

  定义

    简单工厂模式属于创建型模式又叫做静态工厂方法模式,他属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同的类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例(return new 类A),被创建的实例通常有共同的父类。

  简单工厂模式结构图

  简单工厂模式结构图中包含如下几个角色:

  • Factory(工厂角色):工厂角色即工厂类,他是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态工厂方法factoryMethod(),他的返回类型为抽象产品类型Product。
  • Product(抽象产品角色):它是工厂类所创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。
  • ConcreteProduct ( 具体产品角色) :它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现在抽象产品中声明的抽象方法。在简单工厂模式中,客户端通过工厂类来创建一个产品类的实例,而无须直接使用new关键字来创建对象,它是工厂模式家族中最简单的一员。

在使用简单工厂模式时,首先需要对产品类进行重构,不能设计一个包罗万象的产品类,而需根据实际情况设计一个产品层次结构,将所有产品类公共的代码移至抽象产品类,并在抽象产品类中声明一些抽象方法,以供不同的具体产品类来实现,典型的抽象产品类代码如下所示:

public abstract class Product {
    //所有产品类的公共业务方法
    public void methodSame() {
        //公共方法的实现
        System.out.println("抽Product象类的方法");
    }
    //声明抽象业务方法
    public abstract void methodDiff();
}
public class ConcreteProductA extends Product{

    @Override
    public void methodDiff() {
        // 实现业务的方法    
        System.out.println("产品A的方法");
    }
}
public class ConcreteProductB extends Product{

    @Override
    public void methodDiff() {
        // 实现业务的方法
        System.out.println("产品B的方法");
    }
}
public class Factory {
    //    静态工厂方法,返回一个产品实例
    public static Product getProduct(String arg) {
        Product product = null;
        if (arg.equalsIgnoreCase("ConcreteProductA")) {
            product = new ConcreteProductA();
        } else if (arg.equalsIgnoreCase("ConcreteProductB")) {
            product = new ConcreteProductB();
        }
        return product;
    }
}
public class Client {

    public static void main(String[] args) {
        Product product;
        product=Factory.getProduct("ConcreteProductA");//通过工厂类创建产品对象
        product.methodSame();
        product.methodDiff();
    }
}

一个简单的实例

  

    假设有一个电脑的代工生产商,它目前已经可以代工生产联想电脑了,随着业务的拓展,这个代工生产商还要生产戴尔和弘基的电脑,这样我们就需要用一个单独的类来专门生产电脑,这就用到了简单工厂模式。下面我们来实现简单工厂模式:
  
抽象的电脑类:
联想电脑类:
 
 
 
戴尔电脑类
弘基电脑类
 
电脑工厂类:

 

客户端:

 

运行结果

 

简单工厂的优点

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。
  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

简单工厂的缺陷

  • 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
  • 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
  • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,同样破坏了“开闭原则”;在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
  • 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。





 

posted @ 2020-03-28 15:25  崔小磊  阅读(162)  评论(0编辑  收藏  举报