创建型-2-抽象工厂模式( Abstract Factory Pattern )

创建型-2-抽象工厂模式( Abstract Factory Pattern )

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂

1该超级工厂又称为其他工厂的工厂 2 3在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类 4 5每个生成的工厂都能按照工厂模式提供对象 6 7抽象工厂模式属于创建型模式,它提供了一种创建对象的最佳方式。

摘要

1、意图:

1提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2、主要解决:

1主要解决接口选择的问题

3、何时使用:

1系统的产品有多于一个的产品族,而系统只消费其中某一族的产品

4、如何解决:

1在一个产品族里面,定义多个产品

5、关键代码:

1在一个工厂里聚合多个同类产品

6、应用实例:

1工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品 2 3假设一种情况(现实中是不存在的,要不然,没法进入了,但有利于说明抽象工厂模式),在您的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了 4 5用 OO 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)

7、优点:

1当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

8、缺点:

1产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 `Creator` 里加代码,又要在具体的里面加代码

9、使用场景:

11、`QQ` 换皮肤,一整套一起换 22、生成不同操作系统的程序

10、注意事项:

1产品族难扩展,产品等级易扩展

实现

2-抽象工厂模式

1、创建 ShapeColor 接口和实现这些接口的实体类 2、创建抽象工厂类 AbstractFactory 3、定义工厂类 ShapeFactoryColorFactory ,这两个工厂类都是扩展了 AbstractFactory 4、创建一个工厂创造器/生成器类 FactoryProducer 5、AbstractFactoryPatternDemo 使用 FactoryProducer 来获取 AbstractFactory 对象

它将向 AbstractFactory 传递形状信息 ShapeCIRCLE / RECTANGLE / SQUARE ),以便获取它所需对象的类型

同时它还向 AbstractFactory 传递颜色信息 ColorRED / GREEN / BLUE ),以便获取它所需对象的类型

范例

1. 为形状创建一个接口

Shape.java

1public interface Shape { 2 void draw(); 3}

2. 创建实现接口的实体类

Rectangle.java

1package com.ycbbs.tech.gof; 2 3 4public class Rectangle implements Shape { 5 6 @Override 7 public void draw() { 8 System.out.println("Inside Rectangle::draw() method."); 9 } 10}

Square.java

1 2package com.ycbbs.tech.gof; 3 4 5public class Square implements Shape { 6 7 @Override 8 public void draw() { 9 System.out.println("Inside Square::draw() method."); 10 } 11}

Circle.java

1 2package com.ycbbs.tech.gof; 3 4 5public class Circle implements Shape { 6 7 @Override 8 public void draw() { 9 System.out.println("Inside Circle::draw() method."); 10 } 11}

3. 为颜色创建一个接口

Color.java

1 2package com.ycbbs.tech.gof; 3 4 5public interface Color { 6 void fill(); 7}

4. 创建实现颜色接口的实体类

Red.java

1 2package com.ycbbs.tech.gof; 3 4 5public class Red implements Color { 6 7 @Override 8 public void fill() { 9 System.out.println("Inside Red::fill() method."); 10 } 11}

Green.java

1 2package com.ycbbs.tech.gof; 3 4 5public class Green implements Color { 6 7 @Override 8 public void fill() { 9 System.out.println("Inside Green::fill() method."); 10 } 11}

Blue.java

1 2package com.ycbbs.tech.gof; 3 4 5public class Blue implements Color { 6 7 @Override 8 public void fill() { 9 System.out.println("Inside Blue::fill() method."); 10 } 11}

5. 为 Color 和 Shape 对象创建抽象类来获取工厂

AbstractFactory.java

1 2package com.ycbbs.tech.gof; 3 4 5public abstract class AbstractFactory { 6 abstract Color getColor(String color); 7 abstract Shape getShape(String shape) ; 8}

6. 创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象

ShapeFactory.java

1 2package com.ycbbs.tech.gof; 3 4 5public class ShapeFactory extends AbstractFactory { 6 7 @Override 8 public Shape getShape(String shapeType){ 9 if(shapeType == null){ 10 return null; 11 } 12 if(shapeType.equalsIgnoreCase("CIRCLE")){ 13 return new Circle(); 14 } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 15 return new Rectangle(); 16 } else if(shapeType.equalsIgnoreCase("SQUARE")){ 17 return new Square(); 18 } 19 return null; 20 } 21 22 @Override 23 Color getColor(String color) { 24 return null; 25 } 26}

ColorFactory.java

1 2package com.ycbbs.tech.gof; 3 4 5public class ColorFactory extends AbstractFactory { 6 7 @Override 8 public Shape getShape(String shapeType){ 9 return null; 10 } 11 12 @Override 13 Color getColor(String color) { 14 if(color == null){ 15 return null; 16 } 17 if(color.equalsIgnoreCase("RED")){ 18 return new Red(); 19 } else if(color.equalsIgnoreCase("GREEN")){ 20 return new Green(); 21 } else if(color.equalsIgnoreCase("BLUE")){ 22 return new Blue(); 23 } 24 return null; 25 } 26}

7. 创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂

FactoryProducer.java

1 2package com.ycbbs.tech.gof; 3 4 5public class FactoryProducer { 6 public static AbstractFactory getFactory(String choice){ 7 if(choice.equalsIgnoreCase("SHAPE")){ 8 return new ShapeFactory(); 9 } else if(choice.equalsIgnoreCase("COLOR")){ 10 return new ColorFactory(); 11 } 12 return null; 13 } 14}

8. 使用 FactoryProducer 来获取 AbstractFactory,通过传递类型信息来获取实体类的对象

AbstractFactoryPatternDemo.java

1 2package com.ycbbs.tech.gof; 3 4 5public class AbstractFactoryPatternDemo { 6 public static void main(String[] args) { 7 8 //获取形状工厂 9 AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); 10 11 //获取形状为 Circle 的对象 12 Shape shape1 = shapeFactory.getShape("CIRCLE"); 13 14 //调用 Circle 的 draw 方法 15 shape1.draw(); 16 17 //获取形状为 Rectangle 的对象 18 Shape shape2 = shapeFactory.getShape("RECTANGLE"); 19 20 //调用 Rectangle 的 draw 方法 21 shape2.draw(); 22 23 //获取形状为 Square 的对象 24 Shape shape3 = shapeFactory.getShape("SQUARE"); 25 26 //调用 Square 的 draw 方法 27 shape3.draw(); 28 29 //获取颜色工厂 30 AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); 31 32 //获取颜色为 Red 的对象 33 Color color1 = colorFactory.getColor("RED"); 34 35 //调用 Red 的 fill 方法 36 color1.fill(); 37 38 //获取颜色为 Green 的对象 39 Color color2 = colorFactory.getColor("Green"); 40 41 //调用 Green 的 fill 方法 42 color2.fill(); 43 44 //获取颜色为 Blue 的对象 45 Color color3 = colorFactory.getColor("BLUE"); 46 47 //调用 Blue 的 fill 方法 48 color3.fill(); 49 } 50}

编译运行以上 Java 范例,输出结果如下

1Inside Circle::draw() method. 2Inside Rectangle::draw() method. 3Inside Square::draw() method. 4Inside Red::fill() method. 5Inside Green::fill() method. 6Inside Blue::fill() method.
点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

创建型-工厂模式 ( Factory Pattern )

创建型工厂模式(FactoryPattern)tex工厂模式(FactoryPattern)提供了一种创建对象的最佳方式工厂模式在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象工厂

Java设计模式之三种工厂模式

工厂模式实现了创建者和调用者的分离,实现了更好的解耦。详细分类:1)简单工厂模式(静态工厂模式);2)工厂方法模式;3)抽象工厂模式面向对象设计的基本原则:1)      OCP(开闭原则,OpenClosedPrinciple):一个软件的实体应当对扩展开放,对修改关闭。2)      

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0

Java描述设计模式(04):抽象工厂模式

一、抽象工厂模式1、生活场景汽车生产根据用户选择的汽车类型,指定不同的工厂进行生产,选择红旗轿车,就要使用中国工厂,选择奥迪轿车,就要使用德国工厂。2、抽象工厂模式1.抽象工厂模式:定义了一个interface用于创建相关对象或相互依赖的对象,而无需指明具体的类;2.抽象工厂模式可以