GOF - 简单工厂模式

前言:

任何事物的产生都必定有一个过程,不管是简单还是复杂。现实生活中,我们既是生产者也是消费者,因为本文讲述的是简单工厂模式,所以我把自己定义为消费者,大概是属于拿来主义者吧。作为消费者的我们往往是不需要关注生产者的活动,例如产品产出之前是不是需要购买原材料和对原材料如何进行加工等等,我们只需要关心他生产的产品是不是我们需要的,其他不用操心那么多,不然会容易感到头冷→_→。

那么其实对于程序员来说在某些场景下我们需要提供出这样的代码,对于程序的使用者来讲他们是不需要关心某个对象是如何被创建的,以及该对象被创建之前还做了哪些操作,例如一些关联对象的创建、基本能信息的校验以及获取,我们的目的是让程序的使用者获取该对象,而不关心创建该对象的细节和复杂的过程。

有些啰嗦,直接进入正题

 

什么是简单工厂模式?

简单工厂模式属于类的创建新型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

 

以顾客到水果店购买水果为例,用简单工厂模式实现可以包含以下角色:

1. 工厂角色:简单工厂模式的核心,是一个具体的类。负责实现创建所有实例的内部逻辑。可以被外部直接调用,创建所需的产品对象。

2. 产品角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

3. 具体产品角色:简单工厂模式所创建的具体实例对象

4. 客户角色:使用产品的人,该角色体现在本示例java代码中是含有main方法的类

工厂类:

// 工厂类
public class FruitFactory {

    // 生产各种水果的静态方法类
    public static Fruit createFruit(String fruitName){
        Fruit fruit = null;

        switch (fruitName){
            case "banana" :
                fruit = new Banana();
                break;
            case "apple" :
                fruit = new Apple();
                break;
        }
        return fruit;
    }
}

产品接口:

// 水果接口 - 产品接口
public interface Fruit {
    // 获取该水果的名称
    String getName();
}

产品实现:

// 具体那种水果 - 产品实现
public class Apple implements Fruit {

    private String name;

    public Apple() {
        this.name = "这是一个苹果";
    }

    @Override
    public String getName() {
        return name;
    }
}

// ---------- 此处是两个java文件,为方便粘在一起了 -------------
public class Banana implements Fruit {
    private String name;

    public Banana() {
        this.name = "这是一个香蕉";
    }

    @Override
    public String getName() {
        return name;
    }
}

客户:

// 购买水果的客户
public class Customer {
    public static void main(String[] args){

        // 该客户要了两种水果
        Fruit fruit = FruitFactory.createFruit("apple");
        System.out.println(fruit.getName()); // 这是一个苹果
        fruit = FruitFactory.createFruit("banana");
        System.out.println(fruit.getName()); // 这是一个香蕉

    }
}

类结构图:

GOF - 简单工厂模式_第1张图片

简单工厂模式的优点:

1. 降低了客户与产品的耦合度,客户不需要了解产品的产出过程。工厂类将这些复杂的过程进行了封装,客户只按需调用即可。

缺点:

1. 该工厂只能生产特定类型的产品,而且每新增一个产品都要新增一个产品实现类,并且还需要修改工厂类的switch分支,违反开闭原则【对扩展开放;对修改封闭】,改进如果每一种类型的产品有对应的工厂是不是可以解决这个问题即为 - 工厂方法模式。

 

你可能感兴趣的:(设计模式,GOF,简单工厂模式,静态工厂方法模式)