企业做网站需要什么资料,想开个视频网站该怎么做,做玉的网站,wordpress加密某一页面文章目录 1 抽象工厂模式#xff08;Abstract Factory Pattern#xff09;1.1 概念1.2 介绍1.3 小结1.4 结构 2 案例一2.1 案例需求2.2 代码实现 3 案例二3.1 需求3.2 实现 4 总结4.1 抽象工厂模式优缺点4.2 抽象工厂模式使用场景4.3 抽象工厂模式VS工厂方法模式4.4 抽象工厂… 文章目录 1 抽象工厂模式Abstract Factory Pattern1.1 概念1.2 介绍1.3 小结1.4 结构 2 案例一2.1 案例需求2.2 代码实现 3 案例二3.1 需求3.2 实现 4 总结4.1 抽象工厂模式优缺点4.2 抽象工厂模式使用场景4.3 抽象工厂模式VS工厂方法模式4.4 抽象工厂模式VS建造者模式 前言本文章为瑞_系列专栏之《23种设计模式》的抽象工厂模式篇。本文中的部分图和概念等资料来源于博主学习设计模式的相关网站《菜鸟教程 | 设计模式》和《黑马程序员Java设计模式详解》特此注明。本文中涉及到的软件设计模式的概念、背景、优点、分类、以及UML图的基本知识和设计模式的6大法则等知识建议阅读 《瑞_23种设计模式_概述》 本系列-设计模式-链接《瑞_23种设计模式_概述》 本系列-单例模式-链接《瑞_23种设计模式_单例模式》 本系列-工厂模式-链接《瑞_23种设计模式_工厂模式》 本系列-原型模式-链接《瑞_23种设计模式_原型模式》 1 抽象工厂模式Abstract Factory Pattern
1.1 概念 抽象工厂模式Abstract Factory Pattern是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式它提供了一种创建对象的最佳方式。 在抽象工厂模式中接口是负责创建一个相关对象的工厂不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口而无需指定具体实现类。通过使用抽象工厂模式可以将客户端与具体产品的创建过程解耦使得客户端可以通过工厂接口来创建一族产品。 抽象工厂模式与工厂方法模式不同工厂方法模式中考虑的是一类产品的生产这些工厂只生产同种类产品同种类产品称为同等级产品也就是说工厂方法模式只考虑生产同等级的产品但是在现实生活中许多工厂是综合型的工厂能生产多等级种类 的产品如电器厂既生产电视机又生产洗衣机或空调大学既有软件专业又有生物专业等。 1.2 介绍 意图提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。 主要解决主要解决接口选择的问题。 何时使用系统的产品有多于一个的产品族而系统只消费其中某一族的产品。 如何解决在一个产品族里面定义多个产品。 关键代码在一个工厂里聚合多个同类产品。 应用实例工作了为了参加一些聚会肯定有两套或多套衣服吧比如说有商务装成套一系列具体产品、时尚装成套一系列具体产品甚至对于一个家庭来说可能有商务女装、商务男装、时尚女装、时尚男装这些也都是成套的即一系列具体产品。假设一种情况现实中是不存在的但有利于说明抽象工厂模式在您的家中某一个衣柜具体工厂只能存放某一种这样的衣服成套一系列具体产品每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用 OOP 的思想去理解所有的衣柜具体工厂都是衣柜类的抽象工厂某一个而每一件成套的衣服又包括具体的上衣某一具体产品裤子某一具体产品这些具体的上衣其实也都是上衣抽象产品具体的裤子也都是裤子另一个抽象产品。 优点当一个产品族中的多个对象被设计成一起工作时它能保证客户端始终只使用同一个产品族中的对象。 缺点产品族扩展非常困难要增加一个系列的某一产品既要在抽象的 Creator 里加代码又要在具体的里面加代码。 使用场景 1️⃣ QQ 换皮肤一整套一起换。 2️⃣ 生成不同操作系统的程序。 注意事项产品族难扩展产品等级易扩展。 抽象工厂模式通常涉及一族相关的产品每个具体工厂类负责创建该族中的具体产品。客户端通过使用抽象工厂接口来创建产品对象而不需要直接使用具体产品的实现类。
1.3 小结 是一种为访问类提供一个创建一组相关或相互依赖对象的接口且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。 抽象工厂模式是工厂方法模式的升级版工厂方法模式只生产一个等级的产品而抽象工厂模式可生产多个等级的产品。 本文要介绍的抽象工厂模式将考虑多等级产品的生产将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族下图所示横轴是产品等级也就是同一类产品纵轴是产品族也就是同一品牌的产品同一品牌的产品产自同一个工厂。 1.4 结构 抽象工厂模式的主要角色如下 1️⃣ 抽象工厂Abstract Factory提供了创建产品的接口它包含多个创建产品的方法可以创建多个不同等级的产品。 2️⃣ 具体工厂Concrete Factory主要是实现抽象工厂中的多个抽象方法完成具体产品的创建。 3️⃣ 抽象产品Product定义了产品的规范描述了产品的主要特性和功能抽象工厂模式有多个抽象产品。 4️⃣ 具体产品ConcreteProduct实现了抽象产品角色所定义的接口由具体工厂来创建它 同具体工厂之间是多对一的关系。
2 案例一
2.1 案例需求 现有一家咖啡店要生产咖啡还要生产甜点如提拉米苏、抹茶慕斯等要是按照工厂方法模式需要定义提拉米苏类、抹茶慕斯类、提拉米苏工厂、抹茶慕斯工厂、甜点工厂类很容易发生类爆炸情况。其中拿铁咖啡、美式咖啡是一个产品等级都是咖啡提拉米苏、抹茶慕斯也是一个产品等级拿铁咖啡和提拉米苏是同一产品族也就是都属于意大利风味美式咖啡和抹茶慕斯是同一产品族也就是都属于美式风味。 这个案例使用抽象工厂模式实现的类图如下 2.2 代码实现
抽象工厂接口 /*** 抽象工厂** author LiaoYuXing-Ray**/
public interface DessertFactory {// 生产咖啡的功能Coffee createCoffee();// 生产甜品的功能Dessert createDessert();
}咖啡抽象类 /*** 咖啡抽象类** author LiaoYuXing-Ray**/
public abstract class Coffee {public abstract String getName();// 加糖public void addSugar() {System.out.println(加糖);}// 加奶public void addMilk() {System.out.println(加奶);}
}甜品抽象类 /*** 甜品抽象类** author LiaoYuXing-Ray**/
public abstract class Dessert {public abstract void show();
}美式风味的甜品工厂类 /*** 美式风味的甜品工厂* - 生产美式咖啡和抹茶慕斯** author LiaoYuXing-Ray**/
public class AmericanDessertFactory implements DessertFactory {public Coffee createCoffee() {return new AmericanCoffee();}public Dessert createDessert() {return new MatchaMousse();}
}意大利风味甜品工厂类 /*** 意大利风味甜品工厂* - 生产拿铁咖啡和提拉米苏甜品** author LiaoYuXing-Ray**/
public class ItalyDessertFactory implements DessertFactory {public Coffee createCoffee() {return new LatteCoffee();}public Dessert createDessert() {return new Tiramisu();}
}美式咖啡类 /*** 美式咖啡** author LiaoYuXing-Ray**/
public class AmericanCoffee extends Coffee {public String getName() {return 美式咖啡;}
}拿铁咖啡类 /*** 拿铁咖啡** author LiaoYuXing-Ray**/
public class LatteCoffee extends Coffee {public String getName() {return 拿铁咖啡;}
}抹茶慕斯类 /*** 抹茶慕斯类** author LiaoYuXing-Ray**/
public class MatchaMousse extends Dessert {Overridepublic void show() {System.out.println(抹茶慕斯);}
}提拉米苏类 /*** 提拉米苏类** author LiaoYuXing-Ray**/
public class Tiramisu extends Dessert {Overridepublic void show() {System.out.println(提拉米苏);}
}测试类 /*** 测试类** author LiaoYuXing-Ray**/
public class Client {public static void main(String[] args) {// 创建的是意大利风味甜品工厂对象
// ItalyDessertFactory factory new ItalyDessertFactory();AmericanDessertFactory factory new AmericanDessertFactory();// 获取拿铁咖啡和提拉米苏甜品Coffee coffee factory.createCoffee();Dessert dessert factory.createDessert();System.out.println(coffee.getName());dessert.show();}
} 瑞该案例实现使用抽象工厂模式如果要加同一个产品族的话只需要再加一个对应的工厂类即可不需要修改其他的类。 3 案例二 本案例为菜鸟教程中的案例 3.1 需求 我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。 AbstractFactoryPatternDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 ShapeCIRCLE / RECTANGLE / SQUARE以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 ColorRED / GREEN / BLUE以便获取它所需对象的类型。 类图如下 3.2 实现
步骤1 为形状创建一个接口。
Shape.java public interface Shape {void draw();
}步骤2 创建实现接口的实体类。
Rectangle.java public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);}
}Square.java public class Square implements Shape {Overridepublic void draw() {System.out.println(Inside Square::draw() method.);}
}Circle.java public class Circle implements Shape {Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);}
}步骤3 为颜色创建一个接口。
Color.java public interface Color {void fill();
}步骤4 创建实现接口的实体类。
Red.java public class Red implements Color {Overridepublic void fill() {System.out.println(Inside Red::fill() method.);}
}Green.java public class Green implements Color {Overridepublic void fill() {System.out.println(Inside Green::fill() method.);}
}Blue.java public class Blue implements Color {Overridepublic void fill() {System.out.println(Inside Blue::fill() method.);}
}步骤5 为 Color 和 Shape 对象创建抽象类来获取工厂。
AbstractFactory.java public abstract class AbstractFactory {public abstract Color getColor(String color);public abstract Shape getShape(String shape);
}步骤6 创建扩展了 AbstractFactory 的工厂类基于给定的信息生成实体类的对象。
ShapeFactory.java public class ShapeFactory extends AbstractFactory {Overridepublic 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;}Overridepublic Color getColor(String color) {return null;}
}ColorFactory.java public class ColorFactory extends AbstractFactory {Overridepublic Shape getShape(String shapeType){return null;}Overridepublic Color getColor(String color) {if(color null){return null;} if(color.equalsIgnoreCase(RED)){return new Red();} else if(color.equalsIgnoreCase(GREEN)){return new Green();} else if(color.equalsIgnoreCase(BLUE)){return new Blue();}return null;}
}步骤7 创建一个工厂创造器/生成器类通过传递形状或颜色信息来获取工厂。
FactoryProducer.java public class FactoryProducer {public static AbstractFactory getFactory(String choice){if(choice.equalsIgnoreCase(SHAPE)){return new ShapeFactory();} else if(choice.equalsIgnoreCase(COLOR)){return new ColorFactory();}return null;}
}步骤8 使用 FactoryProducer 来获取 AbstractFactory通过传递类型信息来获取实体类的对象。
AbstractFactoryPatternDemo.java public class AbstractFactoryPatternDemo {public static void main(String[] args) {//获取形状工厂AbstractFactory shapeFactory FactoryProducer.getFactory(SHAPE);//获取形状为 Circle 的对象Shape shape1 shapeFactory.getShape(CIRCLE);//调用 Circle 的 draw 方法shape1.draw();//获取形状为 Rectangle 的对象Shape shape2 shapeFactory.getShape(RECTANGLE);//调用 Rectangle 的 draw 方法shape2.draw();//获取形状为 Square 的对象Shape shape3 shapeFactory.getShape(SQUARE);//调用 Square 的 draw 方法shape3.draw();//获取颜色工厂AbstractFactory colorFactory FactoryProducer.getFactory(COLOR);//获取颜色为 Red 的对象Color color1 colorFactory.getColor(RED);//调用 Red 的 fill 方法color1.fill();//获取颜色为 Green 的对象Color color2 colorFactory.getColor(GREEN);//调用 Green 的 fill 方法color2.fill();//获取颜色为 Blue 的对象Color color3 colorFactory.getColor(BLUE);//调用 Blue 的 fill 方法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.4 总结
4.1 抽象工厂模式优缺点
优点 1️⃣ 解耦抽象工厂模式有助于降低客户端与具体实现之间的耦合度从而提高系统的可扩展性和可维护性。 2️⃣ 灵活性抽象工厂模式使得系统更加灵活可以轻松地添加或删除产品族而无需修改客户端代码。 3️⃣ 易于测试由于具体实现与客户端代码的解耦使得测试变得更加容易可以更容易地模拟和验证各种不同的工厂实现。 4️⃣ 多等级产品抽象工厂模式可以支持多等级的产品每个等级可以有自己的工厂实现从而实现更细粒度的控制和配置。 当一个产品族中的多个对象被设计成一起工作时它能保证客户端始终只使用同一个产品族中的对象 缺点 1️⃣ 代码复杂度增加使用抽象工厂模式需要编写更多的代码和接口这可能会增加代码的复杂度和开发时间。 2️⃣ 违反开闭原则在抽象工厂模式中如果要添加一个新的产品族需要修改抽象工厂接口及其所有子类这违反了开闭原则即软件实体应该对扩展开放对修改封闭。 3️⃣ 过度抽象抽象工厂模式可能会导致过度抽象使得系统变得更加复杂和难以理解。 4️⃣ 具体实现依赖如果具体实现依赖于抽象工厂那么它们之间的耦合度仍然很高这可能会限制系统的灵活性和可维护性。 当产品族中需要增加一个新的产品时所有的工厂类都需要进行修改 4.2 抽象工厂模式使用场景
当需要创建的对象是一系列相互关联或相互依赖的产品族时如电器工厂中的电视机、洗衣机、空调等。系统中有多个产品族但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。系统中提供了产品的类库且所有产品的接口相同客户端不依赖产品实例的创建细节和内部结构。 如输入法换皮肤一整套一起换。生成不同操作系统的程序。
4.3 抽象工厂模式VS工厂方法模式 抽象工厂模式是工厂方法模式的升级版工厂方法模式只生产一个等级的产品而抽象工厂模式可生产多个等级的产品。
4.4 抽象工厂模式VS建造者模式 抽象工厂模式实现对产品家族的创建一个产品家族是这样的一系列产品具有不同分类维度的产品组合采用抽象工厂模式则是不需要关心构建过程只关心什么产品由什么工厂生产即可。 建造者模式则是要求按照指定的蓝图建造产品它的主要目的是通过组装零配件而产生一个新产品。 如果将抽象工厂模式看成汽车配件生产工厂生产一个产品族的产品那么建造者模式就是一个汽车组装工厂通过对部件的组装可以返回一辆完整的汽车。 本文是博主的粗浅理解可能存在一些错误或不完善之处如有遗漏或错误欢迎各位补充谢谢 如果觉得这篇文章对您有所帮助的话请动动小手点波关注你的点赞收藏⭐️转发评论都是对博主最好的支持~