对于软件构造中工厂模式的理解

第一、工厂模式

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

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

直接上定义,脑壳子都看得疼,不如直接上实际编程样例

假设,我们现在定义了一个shape接口,他有三种实现,
第一种是Circle;第二种是Square;第三种是Rectangle
在之前的编程习惯中,我必然是先实例化其中的某一个类,然后调用他的方法。但是通过工厂模式,我们可以将实例化延迟到使用该方法的时候。

接下来直接上例子

UML图
首先是创建接口,然后把三个实现类给写好
Shape.java:

public interface Shape {
   void draw();
}

Rectangle.java

public class Rectangle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

public class Square implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

public class Circle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Inside Circle::draw() method.");
   }
}

接着到了工厂模式的重头戏,创建工厂类,通过调用它的函数,来实例化三个实现类中的某一个
ShapeFactory.java

public 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;
   }
}

最后就是使用工厂类了
Use.java

public class Use{
 
   public static void main(String[] args) {
      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();
   }
}

输出结果也会符合预期

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.

以上只是简单方法模式,将所有的实现类都归结于一个工厂类中,在实际应用中,我们还可以使用工厂方法模式,细化工厂类

还是用上面的例子,我们定义新的工厂方法:

首先是一个抽象工厂类
AbsShapeFactory.java

public class AbsShapeFactory{
public Shape getShape(String shapeType)}

接着定义两种具体工厂类
ShapeFactory1.java

public class ShapeFactory1 extends AbsShapeFactory{
    
   //使用 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();
      } 
      return null;
   }
}

ShapeFactory2.java

public class ShapeFactory2 extends AbsShapeFactory {
public Shape getShape(String shapeType){
      if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
}

这样就完成了工厂类的分工

上面两种都是对一个接口shape进行使用,如果在添加一个接口,例如behavior,那么可以使用抽象工厂模式,原理与工厂方法模式类似。我们可以使用一个工厂类来调用shape的实现类,另一个工厂类调用behavior的实现类。

工厂方法可以灵活解决需求变动的问题,但是也有缺陷。
因为无论上述哪种模式,由于可能封装了大量对象和工厂创建,新加产品需要修改已定义好的工厂相关的类,因此对于产品和工厂的扩展不太友好,利弊需要权衡一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值