设计模式3-抽象工厂模式

图片和代码来自原文,原文链接:

http://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm

-----------------------------------------------------------------------------------------------

抽象工厂模式通过一个超级工厂类来生成其他的工厂类。这个工厂也称为工厂的工厂。抽象工厂模式属于创建型模式,提供了创建对象的最佳实践方法之一。

在抽象工厂模式中,一个接口被用来负责创建和具体对象相关联的工厂。每个生成的工厂可以根据工厂类型创建相应的对象。

实现

我们将创建一个Shape接口,一个Color接口,以及实现这两个接口的具体类;然后创建一个抽象工厂类AbstractFactory。工厂类ShapeFactory和ColorFactory定义为AbstractFactory类的子类;再创建一个工厂生成器FactoryProducer。

示例类AbstractFactoryPatternDemo使用FactoryProducer来获取一个AbstractFactory对象。通过向AbstractFactory对象传递Shape信息(CIRCLE /RECTANGLE / SQUARE)来获取Shape类型的对象,通过向AbstractFactory对象传递Color信息(RED / GREEN / BLUE)来获取Color类型的对象。

步骤1:新建一个接口Shape

Shape.java

publicinterfaceShape{

   void draw();

}

步骤2:创建实现Shape接口的类

Rectangle.java

publicclassRectangleimplementsShape{
 
   @Override
   publicvoid draw(){
      System.out.println("Inside Rectangle::draw() method.");
   }
}

Square.java

publicclassSquareimplementsShape{
 
   @Override
   publicvoid draw(){
      System.out.println("Inside Square::draw() method.");
   }
}

Circle.java

publicclassCircleimplementsShape{
 
   @Override
   publicvoid draw(){
      System.out.println("Inside Circle::draw() method.");
   }
}

步骤3:新建一个接口Color

Color.java

publicinterfaceColor{

   void fill();

}

步骤4:创建实现Color接口的类

Red.java

publicclassRedimplementsColor{
 
   @Override
   publicvoid fill(){
      System.out.println("Inside Red::fill() method.");
   }
}

Green.java

publicclassGreenimplementsColor{
 
   @Override
   publicvoid fill(){
      System.out.println("Inside Green::fill() method.");
   }
}

Blue.java

publicclassBlueimplementsColor{
 
   @Override
   publicvoid fill(){
      System.out.println("Inside Blue::fill() method.");
   }
}

步骤5:新建一个抽象类获取Shape工厂和Color工厂

AbstractFactory.java

publicabstractclassAbstractFactory{
   abstractColor getColor(String color);
   abstractShape getShape(String shape);
}

步骤6:创建继承AbstractFactory类的工厂类,根据相应的信息获取具体类的对象。

ShapeFactory.java

publicclassShapeFactoryextendsAbstractFactory{
         
   @Override
   publicShape getShape(String shapeType){
   
      if(shapeType ==null){
         returnnull;
      }          
      
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         returnnewCircle();
         
      }elseif(shapeType.equalsIgnoreCase("RECTANGLE")){
         returnnewRectangle();
         
      }elseif(shapeType.equalsIgnoreCase("SQUARE")){
         returnnewSquare();
      }
      
      returnnull;
   }
   
   @Override
   Color getColor(String color){
      returnnull;
   }
}

ColorFactory.java

publicclassColorFactoryextendsAbstractFactory{
         
   @Override
   publicShape getShape(String shapeType){
      returnnull;
   }
   
   @Override
   Color getColor(String color){
   
      if(color ==null){
         returnnull;
      }          
      
      if(color.equalsIgnoreCase("RED")){
         returnnewRed();
         
      }elseif(color.equalsIgnoreCase("GREEN")){
         returnnewGreen();
         
      }elseif(color.equalsIgnoreCase("BLUE")){
         returnnewBlue();
      }
      
      returnnull;
   }
}

步骤7:创建一个工厂生成类,根据传递的参数(Shape or Color)来获取具体的工厂类。

FactoryProducer.java

publicclassFactoryProducer{
   publicstaticAbstractFactory getFactory(String choice){
   
      if(choice.equalsIgnoreCase("SHAPE")){
         returnnewShapeFactory();
         
      }elseif(choice.equalsIgnoreCase("COLOR")){
         returnnewColorFactory();
      }
      
      returnnull;
   }
}

步骤8:通过传递具体的类型信息,使用FactoryProducer类获取和具体类相关联的工厂。

AbstractFactoryPatternDemo.java

publicclassAbstractFactoryPatternDemo{
   publicstaticvoid main(String[] args){
 
      //get shape factory
      AbstractFactory shapeFactory =FactoryProducer.getFactory("SHAPE");
 
      //get an object of Shape Circle
      Shape shape1 = shapeFactory.getShape("CIRCLE");
 
      //call draw method of Shape Circle
      shape1.draw();
 
      //get an object of Shape Rectangle
      Shape shape2 = shapeFactory.getShape("RECTANGLE");
 
      //call draw method of Shape Rectangle
      shape2.draw();
      
      //get an object of Shape Square 
      Shape shape3 = shapeFactory.getShape("SQUARE");
 
      //call draw method of Shape Square
      shape3.draw();
 
      //get color factory
      AbstractFactory colorFactory =FactoryProducer.getFactory("COLOR");
 
      //get an object of Color Red
      Color color1 = colorFactory.getColor("RED");
 
      //call fill method of Red
      color1.fill();
 
      //get an object of Color Green
      Color color2 = colorFactory.getColor("Green");
 
      //call fill method of Green
      color2.fill();
 
      //get an object of Color Blue
      Color color3 = colorFactory.getColor("BLUE");
 
      //call fill method of Color Blue
      color3.fill();
   }
}

步骤9:输出

Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside Red::fill() method.
Inside Green::fill() method.
Inside Blue::fill() method.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值