简单工厂模式-创建型

也称静态工厂方法模式(Static Factory Method),简单工厂模式是由一个工厂类决定创建出哪一种产品类的实例,不属于23种GOF设计模式之一

简单工厂模式的结构

简单工厂模式-创建型_第1张图片

类图与角色

简单工厂模式-创建型_第2张图片
工厂类(Creator):负责生产产品,提供一个静态方法且其返回类型为Product,通过方法参数来决定生产哪种类型的具体产品。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体Java类实现。
产品接口(Product):具体产品必须实现的接口。
具体产品(Concrete Product):对Product接口的实现。

示例

//抽象产品接口
interface Fruit{
    //生长
    public void grow();
    //收获
    public void harvest();
    //种植
    public void plant();
}
//具体产品
class Apple implements Fruit{
    @Override
    public void grow(){
        System.out.println("Apple is  growing");
    }
    @Override
    public void harvest(){
        System.out.println("Apple has been  harvested");
    }
    @Override
    public void plant(){
        System.out.println("Apple has been  planted");
    }
}
class Orange implements Fruit{
    @Override
    public void grow(){
        System.out.println("Orange is  growing");
    }
    @Override
    public void harvest(){
        System.out.println("Orange has been  harvested");
    }
    @Override
    public void plant(){
        System.out.println("Orange has been  planted");
    }
}
//工厂类
class FruitGardener{
    public static Fruit getFruit(String which) throws Exception{
        if(which.equalsIgnoreCase("apple")){
            return new Apple();
        }else if(which.equalsIgnoreCase("orange")){
            return new Orange();
        }else{
            throw new Exception("No this Fruit");
        }
    }
}
//客户端代码
class test  {
	public static void main (String[] args) throws java.lang.Exception	{
	    Fruit fruit=FruitGardener.getFruit("apple");
	    fruit.plant();
	    fruit.grow();
	    fruit.harvest();
	    fruit=FruitGardener.getFruit("orange");
	    fruit.plant();
	    fruit.grow();
	    fruit.harvest();
	}
}

优点

工厂类含有必要的 判断 逻辑来决定什么时候创建以及创建什么类型的产品。而客户端则可以免除直接创建产品对象的责任,而仅仅负责消费产品,实现了创建对象和使用对象的职责分离。

Java中的应用

DateFormat 抽象类及其子类(SimpleDateFormat )用于格式化一个本地日期或者时间,该工具类在处理日期及时间格式上很有用处。
简单工厂模式-创建型_第3张图片
DateFormat 提供了三个重载的静态方法getDateInstance(),并声明返回类型为DateFormat 类型。
getDateInstance()方法返回一个SimpleDateFormat 的实例。 显然,这里使用静态工厂方法是为了将具体子类实例化的工作隐藏起来,从而客户端必须考虑如何将具体子类实例化,因为抽象类 DateFormat 的静态工厂方法会提供合适的具体子类的实例。

你可能感兴趣的:(简单工厂模式)