设计模式-工厂模式(一)

设计模式的学习与使用在JAVA编写的程序中占有举足轻重的地位,因此笔者今天就简单的说一下设计模式中的工厂模式。

那么,什么是工厂模式?

工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。


工厂模式的分类:

1.简单工厂模式

2.工厂方法模式

3.抽象工厂模式


由于代码量较大(使用JAVA实现),因此笔者将这三种工厂模式分开讲述,这样也方便我们的读者阅读与收藏。

那么接下来我们以代码的形式将简单工厂模式简单的说一下:

简单工厂模式

简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。

它存在的目的很简单:定义一个用于创建对象的接口。


在简单工厂类模式中存在3个角色

1.工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 
2.抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。 
3.具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。


比如说有一个农场公司,专门向市场销售各类水果

葡萄 Grape

草莓 Strawberry

苹果 Apple


首先建立我们的抽象产品角色,也就是我们的Fruit类:

package com.kameleon.simpleFactory;

public interface Fruit
{
	/**
	* 生长
	*/
	void grow();
	/**
	* 收获
	*/
	void harvest();
	/**
	* 种植
	*/
	void plant();
}

接下来是我们的具体产品角色,在这里笔者只建立了Apple类,其他具体产品类的建立同理可得:

package com.kameleon.simpleFactory;

public class Apple implements Fruit
{
	private int treeAge;
	
	public void grow()
	{
		log("Apple is growing...");
	}
	
	public void harvest()
	{
		log("Apple has been harvested.");
	}
	
	public void plant()
	{
		log("Apple has been planted.");
	}
	
	public static void log(String msg)
	{
		System.out.println(msg);
	}
	
	public int getTreeAge()
	{
		return treeAge;
	}
	
	public void setTreeAge(int treeAge)
	{
		this.treeAge = treeAge;
	}
}


之后是我们的工厂类角色:

package com.kameleon.simpleFactory;

public class FruitGardener
{
    public static Fruit factory(String which) throws BadFruitException
    {
        if (which.equalsIgnoreCase("apple"))
        {
            return new Apple();
        }
        else if (which.equalsIgnoreCase("strawberry"))
        {
            return new Strawberry();
        }
        else if (which.equalsIgnoreCase("grape"))
        {
            return new Grape();
        }
        else
        {
         	throw new BadFruitException("Bad fruit request");
        }
    }
}

最后我们写一个测试类Farmer:

package com.kameleon.simpleFactory;

public class Farmer {
	public static void main(String[] args){
		Fruit fruit;
		try {
			fruit = FruitGardener.factory("Apple");
			fruit.grow();
			fruit.plant();
			fruit.harvest();
		} catch (BadFruitException e) {
			e.printStackTrace();
		}
	}
}

输出自然不用我多说,接下来我们简单地分析下简单工厂模式:

首先是简单工厂模式的结构:


我们可以看到这样的工厂模式的优点

模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式通过这种做法实现了对责任的分割。

然而这样的工厂模式也存在诸多缺点

1.当产品类有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,就是模式的缺点。

这个工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类,有人把这种类叫做上帝类(God Class)。在这个例子中,这个全能类代表的是农场的一个具体园丁,那么这个园丁需要对所有的产品负责,成了农场的关键人物,他什么时候不能正常工作了,整个农场都要受到影响。

2.当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。

3.由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。


在这里还需要提一下设计模式中另一个重要的设计原则:

“开–闭”原则:

“开–闭”原则要求一个系统的设计能够允许系统在无需修改的情况下,扩展其功能。

然而在简单工厂模式中,简单工厂角色只在有限的程度上支持“开–闭”原则。


在接下来的内容中,笔者将继续介绍工厂模式的另外一个分类:工厂方法模式


那么如果存在什么问题,欢迎大家指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值