工厂模式(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
|
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
|
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
|
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");
|
总结
开发过程中常用的应该是简单工厂模式和抽象工厂模式,当需要频繁为实体类添加工厂时,抽象工厂模式占优。
参靠:工厂模式|菜鸟教程