设计模式的学习与使用在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.由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。
在这里还需要提一下设计模式中另一个重要的设计原则:
“开–闭”原则:
“开–闭”原则要求一个系统的设计能够允许系统在无需修改的情况下,扩展其功能。
然而在简单工厂模式中,简单工厂角色只在有限的程度上支持“开–闭”原则。
在接下来的内容中,笔者将继续介绍工厂模式的另外一个分类:工厂方法模式
那么如果存在什么问题,欢迎大家指出!