设计模式之工厂方法模式(Java实现)

Factory Method(工厂方法)

一、意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

二、结构

工厂方法模式的结构如图7.27所示。 其中: • Product定义工厂方法所创建的对象的接口。 • ConcreteProduct 实现 Product 接口。 • Creator声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个 工厂方法的默认实现,它返回一个默认的ConcretePioduct对象,可以调用工厂方法以创建一个Product对象。 • ConcreteCreator重定义工厂方法以返回一个ConcreteProduct实例。

三、适用性

Factory Method 模式适用 : • 当一个类不知道它所必须创建的对象的类的时候。 • 当一个类希望由它的子类来指定它所创建的对象的时候。 • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

四、实现

我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。

FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。 首先 创建一个接口:。

interface Shape {
          
   
   void draw();
}

然后 创建实现接口的实体类。

class Rectangle implements Shape {
          
   
	   @Override
	   public void draw() {
          
   
	      System.out.println("矩形被画出来了");
	   }
}

class Square implements Shape {
          
   
	   @Override
	   public void draw() {
          
   
	      System.out.println("正方形被画出来了");
	   }
}
class Circle implements Shape {
          
   
	   @Override
	   public void draw() {
          
   
	      System.out.println("圆被画出来了");
	   }
}

其次 创建一个工厂,生成基于给定信息的实体类的对象。

class ShapeFactory {
          
   
     //使用 getShape 方法获取形状类型的对象
	   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;
	   }
}

最后 使用该工厂,通过传递类型信息来获取实体类的对象。

public class FactoryMethod {
          
   

	public static void main(String[] args) {
          
   
		// TODO Auto-generated method stub
		  ShapeFactory shapeFactory = new ShapeFactory();		  
	      //获取 Circle 的对象,并调用它的 draw 方法
	      Shape shape1 = shapeFactory.getShape("CIRCLE");	 
	      //调用 Circle 的 draw 方法
	      shape1.draw();	 
	      //获取 Rectangle 的对象,并调用它的 draw 方法
	      Shape shape2 = shapeFactory.getShape("RECTANGLE");	 
	      //调用 Rectangle 的 draw 方法
	      shape2.draw(); 
	      //获取 Square 的对象,并调用它的 draw 方法
	      Shape shape3 = shapeFactory.getShape("SQUARE");	 
	      //调用 Square 的 draw 方法
	      shape3.draw();
	}

}

运行结果:

五、小结

一、一句话概括工厂模式

简单工厂:一个工厂类,一个产品抽象类。 工厂方法:多个工厂类,一个产品抽象类。 抽象工厂:多个工厂类,多个产品抽象类。

二、生活中的工厂模式

简单工厂类:一个麦当劳店,可以生产多种汉堡。 工厂方法类:一个麦当劳店,可以生产多种汉堡。一个肯德基店,也可以生产多种汉堡。 抽象工厂类:百胜餐饮集团下有肯德基和百事公司,肯德基生产汉堡,百事公司生成百事可乐。

经验分享 程序员 微信小程序 职场和发展