Java简单工厂模式-创建型

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

简单工厂模式的结构


类图与角色


工厂类(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 )用于格式化一个本地日期或者时间,该工具类在处理日期及时间格式上很有用处。

DateFormat 提供了三个重载的静态方法getDateInstance(),并声明返回类型为DateFormat 类型。
getDateInstance()方法返回一个SimpleDateFormat 的实例。显然,这里使用静态工厂方法是为了将具体子类实例化的工作隐藏起来,从而客户端不必考虑如何将具体子类实例化,因为抽象类DateFormat 的静态工厂方法会提供合适的具体子类的实例。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值