简单工厂模式--使用--扩展--缺点--适用情况--

时间:2021-06-22 21:16:09

简单工厂模式的一些基本知识

本文主要参见自《Java与模式》


一、UML类图表示如下

简单工厂模式--使用--扩展--缺点--适用情况--

二、角色如下

1.Product接口:

a.含有具体产品的共有接口。

2.ProductA,ProductB

a.工厂类所创建的这个角色的实例。

3.Factroy:

a.简单工厂模式的核心。

b.工厂类在客户端的直接调用下创建产品对象。


三、基本代码实现如下:

1.Product接口:

package com.jue.dp;
public interface Fruit {

void grow();

void harvest();

void plant();
}

2.ProductA,ProductB

package com.jue.dp;

public class Apple implements Fruit {
public static final String APPLE = "apple";

@Override
public void grow() {
LogUtil.logs(APPLE, "grow");
}

@Override
public void harvest() {
LogUtil.logs(APPLE, "harvest");
}

@Override
public void plant() {
LogUtil.logs(APPLE, "plant");
}

}

其他雷同!

3.Factroy:

package com.jue.dp;

public class FruitFactory {

public static Fruit newInstance(String name) {
if (name.equals("Apple")) {
return new Apple();
}

if (name.equals("Grape")) {
return new Grape();
}

if (name.equals("Strawberry")) {
return new Strawberry();
}
throw new BadFruitException(name);
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Fruit f1 = FruitFactory.newInstance("Apple");
f1.plant();
f1.grow();
f1.harvest();
}
}

四、优点:

1.责任分割:客户端可以免除直接创建产品对象的责任,客户端无需考虑如何创建,只需要知道创建什么以及负责消费产品

五、缺点

1.开闭原则:

a.客户端符合开比原则

b.工厂类不符合:需要修改核心类,增加新的产品将导致工厂类的修改。

2.Factory变得臃肿:当产品比较多的时候,factory会无比臃肿。

3.无法继承:简单静态工厂的创建方法通常是static的,导致工厂角色无法形成继承结构。

六、扩展 : 使用反射可以创建任意产品对象。

public class FruitFactory2 {

public static Fruit newInstance(String name) {

Fruit f = null;
try {
f = (Fruit) Class.forName(name).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return f;
}

public static void main(String args[]){
Fruit f1 = FruitFactory2.newInstance("com.jue.dp.Apple");
f1.plant();
f1.grow();
f1.harvest();
}
}


七、使用场景

a.简单工厂模式所创建的对象往往属于一个产品等级。

b.创建的对象比较少。

c.客户端关心于创建什么以及如何消费,而不关心如何创建。

八、简单工厂模式与单例模式的关系

1.抽象产品省略,工厂角色与具体产品合并,这种退化的简单工厂模式与单例有很多相似之处,但是与单例是不同的。

2.不同之处:

工厂模式总是创建新的实例。

单例模式要求单例类的构造器是私有的,禁止外部客户端对其实例化。

3. 联系

单例模式是建立在简单静态工厂模式基础之上的。