抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

实例

定义一个形状(Sharp)父类,其子类有圆(Circle),正方形(Square),长方形(Rectangle);

通过工厂模式获取其子类实例。

简单工厂模式

1.静态工厂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 静态工厂
* @author XuZhengtong
* @date 2019/7/15 21:27
*/
public class StaticFactory {
public static ShapeMe getShape(String name){
if (name==null)return null;
if ("circle".equals(name)){
return new Circle();
}else if ("square".equals(name)){
return new Square();
}else if ("rectangle".equals(name)){
return new Rectangle();
}
return null;
}
}

可通过类名.get方法获取相应对象。

2.实例工厂

去掉上例static修饰,然后通过实例化工厂类并调用get方法获取相应对象。

工厂方法模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 工厂方法模式
* @author XuZhengtong
* @date 2019/7/15 21:48
*/
public interface Factory {
ShapeMe getSharp();
}

public class CircleFactory implements Factory {
@Override
public ShapeMe getSharp() {
return new Circle();
}
}
...//其他形状略过

获取实例方式:

1
2
Factory factory = new CircleFactory();
ShapeMe s3 = factory.getSharp();

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

在上例中再加入一个实体类Color,对应子类Blue,Yellow。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* 抽象工厂方法
* @author XuZhengtong
* @date 2019/7/15 22:06
*/
public abstract class AbstractFactory {
public abstract ShapeMe getSharp(String name);
public abstract ColorMe getColor(String name);
}

public class SharpFactory extends AbstractFactory {
@Override
public ShapeMe getSharp(String name) {
if (name==null)return null;
if ("circle".equals(name)){
return new Circle();
}else if ("square".equals(name)){
return new Square();
}else if ("rectangle".equals(name)){
return new Rectangle();
}
return null;
}

@Override
public ColorMe getColor(String name) {
return null;
}
}

public class ColorFactory extends AbstractFactory {
@Override
public ShapeMe getSharp(String name) {
return null;
}

@Override
public ColorMe getColor(String name) {
if (name==null)return null;
if ("blue".equals(name)){
return new Blue();
}else if ("yellow".equals(name)){
return new Yellow();
}
return null;
}
}

  • 可以看出,这种方式对于创建一个新的工厂有优势
  • 然后你还需要创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂
1
2
3
4
5
6
7
8
9
10
11
public class FactoryProducer {
public static AbstractFactory getFactory(String name){
if (name==null)return null;
if ("sharp".equals(name)){
return new SharpFactory();
}else if ("color".equals(name)){
return new ColorFactory();
}
return null;
}
}

获取方式如下

1
2
AbstractFactory sharpFactory = FactoryProducer.getFactory("sharp");
ShapeMe s4 = sharpFactory.getSharp("circle");

总结

开发过程中常用的应该是简单工厂模式和抽象工厂模式,当需要频繁为实体类添加工厂时,抽象工厂模式占优。

参靠:工厂模式|菜鸟教程

评论