设计模式之工厂方法模式(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();
	}

}

运行结果:
在这里插入图片描述

五、小结

一、一句话概括工厂模式

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

二、生活中的工厂模式

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值