概念
建立一个工厂类,对实现了同一接口的一些类提供创建它们的对象的方法。
工厂模式分为三种:普通工厂方法模式、多个工厂方法模式、静态工厂方法模式。
优点:
- 屏蔽对象的具体创建逻辑,调用者只关心用来创建对象的工厂类(和类中方法)。
- 扩展性高,如果想增加一个产品,只需要创建产品类并在工厂类中修改代码。
缺点:
1.客户端创建对象时会依赖工厂类,如果想要提供新的创建新产品的工厂方法,必须对工厂类进行修改,这违背了闭包原则。由此,使用抽象工厂模式来符合闭包原则。
普通工厂方法模式
建立一个工厂类,对实现了同一接口的一些类提供创建对象的方法。
创建一个产品接口:Shape
package pattern.factory;
public interface Shape {
void draw();
}
创建实现产品接口的产品实体类:Rectangle ,Square ,Circle
package pattern.factory;
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
package pattern.factory;
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
package pattern.factory;
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
创建一个工厂,用于生成,基于给定信息的实体类的对象:
package pattern.factory;
public class ShapeFactory {
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
客户端:使用该工厂类,通过传递类型信息来获取实体类的对象:
package pattern.factory;
public class FactoryPatternDemo {
public static void main(String[] args) {
//创建一个工厂对象,用来获取产品对象
ShapeFactory shapeFactory = new ShapeFactory();
//获取 Circle 的对象,并调用它的 draw 方法
Shape shape1 = shapeFactory.getShape("CIRCLE");
shape1.draw();
}
}
Output:
Inside Circle::draw() method.
多个工厂方法模式
对普通工厂方法模式的改进。在工厂类中提供多个工厂方法,分别创建不同的对象
创建一个接口:Shape
创建实现接口的产品实体类:Rectangle ,Square ,Circle
创建一个工厂接口,包含多个创建不同对象的工厂方法:
package pattern.factory;
public class ShapeFactory {
public Shape getRectangle() { //工厂方法1
return new Rectangle();
}
public Shape getSquare() { //工厂方法2
return new Square();
}
public Shape getCircle() { //工厂方法3
return new Circle();
}
}
客户端:使用该工厂类,通过工厂方法来获取实体类的对象:
package pattern.factory;
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory factory = new ShapeFactory ();
Shape shape = factory.getCircle();
shape.draw();
}
}
Output:
Inside Circle::draw() method.
静态工厂方法模式
将多个工厂方法模式里的工厂方法置为静态的,使其不需要创建实例,可以直接调用
创建一个接口:Shape
创建实现接口的产品实体类:Rectangle ,Square ,Circle
创建一个工厂接口,包含多个创建不同对象的工厂方法:
package pattern.factory;
public class ShapeFactory {
public static Shape getRectangle() { //静态工厂方法1
return new Rectangle();
}
public static Shape getSquare() { //静态工厂方法2
return new Square();
}
public static Shape getCircle() { //静态工厂方法3
return new Circle();
}
}
客户端:使用该工厂类,通过静态工厂方法来获取实体类的对象:
package pattern.factory;
public class FactoryPatternDemo {
public static void main(String[] args) {
Shape shape = ShapeFactory .getCircle();
shape.draw();
}
}
Output:
Inside Circle::draw() method.