设计模式---抽象工厂模式
创始人
2024-06-01 19:20:47
0

目录

1 介绍

2 优缺点

3 实现

1 介绍

抽象工厂模式(Abstract Factory Pattern) 是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显示指定它们的类。每个生成的工厂都能按照工厂模式提供对象。可以将抽象工厂模式理解为工厂模式的扩展。

2 优缺点

优点

  \bullet 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,因此抽象工厂模式得到了广泛使用。

  \bullet 增加新的具体工厂和实体类很方便,无须修改已有系统,符合“开闭原则”。

缺点:

  \bullet 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持程序倾斜性。

  \bullet 增加了系统的抽象性和理解难度。

 

3 实现

我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着是定义工厂类 ShapeFactory 和 ColorFactory,这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。

AbstractFactoryPatternDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 Shape(CIRCLE/RECTANGLE/SQUARE),以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 Color(RED/GREEN/BLUE),以便获取它所需对象的类型。

步骤1:创建 Shape 形状接口

public interface Shape{void draw();
}

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

public class Circle implements Shape{@overridepublic void draw(){System.out.println("Circle");}
}
public class Rectangle implements Shape{@overridepublic void draw(){System.out.println("Rectangle");}
}
public class Square implements Shape{@overridepublic void draw(){System.out.println("Square"):}
}

 步骤3:创建 Color 接口

public interface Color{void fill();
}

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

public class Red implements Color{@overridepublic void fill(){System.out.println("Red"):}
}
public class Green implements Color{@overridepublic void fill(){System.out.println("Green"):}
}
public class Blue implements Color{@overridepublic void fill(){System.out.println("Blue"):}
}

 步骤5:创建抽象工厂 AbstractFactory 接口

public interface AbstractFactory{public abstract Shape getShape(String shapeType);public abstract Color getColor(String colorType);
}

 步骤6:创建实现 AbstractFactory 的 ShapeFactory 来获取具体的 Shape 实例(Rectangle/square/ circle)和 ColorFactory 来获取具体的 Color 实例(Red/Green/Blue)。

public class ShapeFactory implements AbstractFactory{@overridpublic Shape getShape(String shapeType){if(shapeType == null)return nulll;} else {if(shapeType.equals("Rectangle"){return new Rectangle();}else if(shpeType.equals("Square"){return new Square();}else if(shapeType.equals("Circle"){return new Circle();}else {System.out.println("error");return null;}}}@overridepublic Color getColor(String ColorType){return null;}
}
public class ColorFactory implements AbstractFactory{@overridpublic Shape getColor(String colorType){if(colorType == null)return nulll;} else {if(colorType.equals("Red"){return new Red();}else if(colorType.equals("Green"){return new Green();}else if(colorType.equals("Blue"){return new Blue();}else {System.out.println("error");return null;}}}@overridepublic Color getShape(String shapeType){return null;}
}

 步骤7:创建一个工厂生成器类 FactoryProducer,通过传递的信息来获取 ShapeFactory 或者 ColorFactory

public class FactoryProducer{public static AbstractFactory getFactory(String choice){if(choice == null){return null;}if(choice.equals("Shape"){return new ShapeFactory();else if(choice.equals("Color"){return new ColorFactory();}else {System.out.println("error");return null;}}
}

 步骤8:创建 AbstractFactoryPatternDemo 类,使用 FactoryProducer 来获取到具体的Factory (ShapeFactory/ColorFactory),然后再获取到Shape和 Color 的具体实现类。

public class AbstractFactoryPatternDemo{public static void main(String[] args){// 获取 ShapeFactory 工厂实例AbstractFactory shapeFactory = FactoryProducer.getFactory("Shape");//获取 Rectangle 实例,并调用 draw 方法Shape rectangle = shapeFactory.getShape("Rectangle");rectangle.draw();// 获取 Square 实例,并调用 draw 方法Shape square = shapeFactory.getShape("Square");square.draw();// 获取 circle 实例,并调用 draw 方法Shape circle = shapeFactory.getShape("Circle");circle.draw();// 获取 ColorFactory 工厂实例AbstractFactory colorFactory = FactoryProducer.getFactory("Color");//获取 Red 实例,并调用 draw 方法Color Red = colorFactory.getColor("Red");red.fill();// 获取 Green 实例,并调用 draw 方法Color Green = colorFactory.getColor("Green");Green.fill();// 获取 Blue 实例,并调用 draw 方法Color Blue = colorFactory.getColor("Blue");Blue.fill();

注意:抽象工厂模式当我们新增加一个类型,比如Course,我们只需要新增一个 CourseFactory 实现 AbstractFactory, 然后里面返回具体的实体类对象(Math/Chinese/English)即可,满足开闭原则。但是当我们需要向 Shape 或者 Color 里新增一个实体类,此时就要修改对应ShapeFactory 或者ColorFactory 里的代码,此时就不满足开闭原则

相关内容

热门资讯

与龙共舞的曲目列表 与龙共舞的曲目列表01 The Dragon´s Legend(Medley)02 Br...
孩子得了一种病毒,看他这样我也... 孩子得了一种病毒,看他这样我也很痛苦自从生下地第二天孩子就做院了,刚开始只是起了一片红的,还以是烫着...
带头盔的一个卡通人物叫什么? 带头盔的一个卡通人物叫什么?带头盔的一个卡通人物叫什么? 目前最新的……应该就是无头骑士异闻录了吧!...
小主播如何月入过万 小主播如何月入过万
地矿局野外工作艰苦吗 地矿局野外工作艰苦吗地矿局野外工作比较艰苦的,他们要扛着相关测量探测仪器,到野外探测矿藏,挖样块,做...
没离婚老婆不管孩子怎么办,老婆... 没离婚老婆不管孩子怎么办,老婆离家出走不管孩子我该咋办?可以诉讼。老婆离家出走不管孩子,可以向法院提...
阴历中的润月有的是润五月有的是... 阴历中的润月有的是润五月有的是润九月是怎么回事这润月是怎样算的呀还有这为什么有润月哟求解答三年一润,...
歌曲经典老歌 歌曲经典老歌歌曲经典老歌有:《斯卡薯郑罩布罗集市》、《AuldLangSyne》、《Yesterda...
怎样找到自己的梦想 怎样找到自己的梦想首先要给自己定一个小目标一点去奋斗,当在奋斗中就能获得自己的梦想梦想是什么?俗话都...
吉利星瑞的油耗怎么样? 吉利星瑞的油耗怎么样?吉利星瑞的油耗怎么样?估测实际油耗多少?不可能6.7L油,平均油耗最低要8个油...
佛山什么建筑最高? 佛山什么建筑最高?罗浮宫国际家居总部大厦最高。罗浮宫国际家居总部大厦位于佛山乐从,总高度为236.0...
怎么写未来一个月的活动计划? 怎么写未来一个月的活动计划?如果你是一个学校的学习部部长,为了提高学校的学习气氛的一些活动,你要怎样...
背起我的行囊走在那老路上。这首... 背起我的行囊走在那老路上。这首歌叫什么名字?这首歌曲叫:流浪兄弟
九十年代的一部武打电视剧有一个... 九十年代的一部武打电视剧有一个称为白衣人的出手就让对方眉心中剑的叫什么名字九十年代的一部武打电视剧有...
给我讲五个幽默笑话? 给我讲五个幽默笑话?幽默笑话幽默笑话幽默笑话幽默笑话幽默笑话
穷人与富人的差别只有一个字不是... 穷人与富人的差别只有一个字不是吗?同样的有钱没钱都是人!有钱没钱都是人,但不能随意、堕落啊
金色琴弦 12话具体内容 金色琴弦 12话具体内容那个因为时间不够来不及看完,只好来求助一下对柚木突然的暴变,香穗子无法隐藏内...
内心自卑敏感的人,适合学习心理... 内心自卑敏感的人,适合学习心理学吗是可以的,学习心理是自我成长的过程,不过要改善这个过程,还是通过系...
求和光之子类似的小说 求和光之子类似的小说主角要坚强,能拼,是魔法师,也有元素云云,不是现代太多了~~~~~主角要坚强,能...
男生对女生说想吃你是什么意思? 男生对女生说想吃你是什么意思?这是我男朋友对我这么说的,因为我是初恋,经验不足,想请教各位哥哥姐姐是...