做网站遇到的困难总结,黑群晖的做网站文件,php网站开发待遇,wordpress设置 文件前言
这2个月来#xff0c;重新出发#xff0c;从java开发需要的数据库、查询日志工具、开发工具等的安装、环境配置#xff0c;再到后面的基础学习、数据库学习、扩展学习#xff08;maven、mq、设计模式、spring 系列等等#xff09;#xff0c;边学边记录#xff0c…前言
这2个月来重新出发从java开发需要的数据库、查询日志工具、开发工具等的安装、环境配置再到后面的基础学习、数据库学习、扩展学习maven、mq、设计模式、spring 系列等等边学边记录基本上都已经完成此篇是找工作之前的最后一篇了主要以https://www.runoob.com/design-pattern/factory-pattern.html内容为主。
感谢各位的分享以及努力的自己改变永远不嫌晚。无论你是几岁也无论你目前所处的境况有多糟只要立定目标、一步一步往前走人生随时都有翻盘的可能性祝各位一帆风顺前途坦荡愿自己能找到心仪的工作不负未来。
1、工厂模式
工厂模式Factory Pattern是 Java 中最常用的设计模式之一它提供了一种创建对象的方式使得创建对象的过程与使用对象的过程分离。
工厂模式提供了一种创建对象的方式而无需指定要创建的具体类。
通过使用工厂模式可以将对象的创建逻辑封装在一个工厂类中而不是在客户端代码中直接实例化对象这样可以提高代码的可维护性和可扩展性。
1.1、工厂模式的类型
简单工厂模式Simple Factory Pattern 简单工厂模式不是一个正式的设计模式但它是工厂模式的基础。它使用一个单独的工厂类来创建不同的对象根据传入的参数决定创建哪种类型的对象。 工厂方法模式Factory Method Pattern 工厂方法模式定义了一个创建对象的接口但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类。 抽象工厂模式Abstract Factory Pattern 抽象工厂模式提供一个创建一系列相关或互相依赖对象的接口而无需指定它们具体的类。 1.2、应用实例
汽车制造你需要一辆汽车只需从工厂提货而不需要关心汽车的制造过程及其内部实现。Hibernate更换数据库时只需更改方言Dialect和数据库驱动Driver即可实现对不同数据库的切换。
1.3、优点
调用者只需要知道对象的名称即可创建对象。 扩展性高如果需要增加新产品只需扩展一个工厂类即可。 屏蔽了产品的具体实现调用者只关心产品的接口。
1.4、缺点
每次增加一个产品时都需要增加一个具体类和对应的工厂使系统中类的数量成倍增加增加了系统的复杂度和具体类的依赖。
1.5、使用场景
日志记录日志可能记录到本地硬盘、系统事件、远程服务器等用户可以选择记录日志的位置。数据库访问当用户不知道最终系统使用哪种数据库或者数据库可能变化时。连接服务器的框架设计需要支持 “POP3”、“IMAP”、“HTTP” 三种协议可以将这三种协议作为产品类共同实现一个接口。
1.6、结构
工厂模式包含以下几个主要角色
抽象产品Abstract Product定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口规定了产品对象的共同方法。具体产品Concrete Product实现了抽象产品接口定义了具体产品的特定行为和属性。抽象工厂Abstract Factory声明了创建产品的抽象方法可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。具体工厂Concrete Factory实现了抽象工厂接口负责实际创建具体产品的对象。
1.7、实现
我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息CIRCLE / RECTANGLE / SQUARE以便获取它所需对象的类型。 步骤 1 创建一个接口:
Shape.javapublic interface Shape {void draw();
}步骤 2 创建实现接口的实体类。
Rectangle.javapublic class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);}
}Square.javapublic class Square implements Shape {Overridepublic void draw() {System.out.println(Inside Square::draw() method.);}
}Circle.javapublic class Circle implements Shape {Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);}
}步骤 3 创建一个工厂生成基于给定信息的实体类的对象。
ShapeFactory.javapublic 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;}
}步骤 4 使用该工厂通过传递类型信息来获取实体类的对象。
FactoryPatternDemo.javapublic class FactoryPatternDemo {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();}
}步骤 5 执行程序输出结果
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.总结简单描述为我有圆形、正方形、三角形可是我想绘制一个梯形在工厂模式让我我不需要知道是怎么绘制的我只关心我调用工厂能拿到绘制好的梯形因为工厂模式的缺点每次增加一个产品时都需要增加一个具体类和对应的工厂。
所以我只需要跟工厂说我想要绘制好的梯形这个时候工厂会创建一个梯形的具体类用来实现绘制接口用Draw独立绘制梯形客户对接的是工厂而不是绘制接口因此客户只需要告诉工厂代码比如上述的shapeFactory.getShape(“CIRCLE”);中的CIRCLE就能拿到绘制好的梯形了。
2、抽象工厂模式
在抽象工厂模式中接口是负责创建一个相关对象的工厂不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口而无需指定具体实现类。通过使用抽象工厂模式可以将客户端与具体产品的创建过程解耦使得客户端可以通过工厂接口来创建一族产品。
2.1、结构
抽象工厂模式包含以下几个主要角色 抽象工厂Abstract Factory声明了一组用于创建产品对象的方法每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。具体工厂Concrete Factory实现了抽象工厂接口负责创建具体产品对象的实例。抽象产品Abstract Product定义了一组产品对象的共同接口或抽象类描述了产品对象的公共方法。具体产品Concrete Product实现了抽象产品接口定义了具体产品的特定行为和属性。 抽象工厂模式通常涉及一族相关的产品每个具体工厂类负责创建该族中的具体产品。客户端通过使用抽象工厂接口来创建产品对象而不需要直接使用具体产品的实现类。
2.2、实现
我们将创建 Shape 和 Color 接口和实现这些接口的实体类。下一步是创建抽象工厂类 AbstractFactory。接着定义工厂类 ShapeFactory 和 ColorFactory这两个工厂类都是扩展了 AbstractFactory。然后创建一个工厂创造器/生成器类 FactoryProducer。
AbstractFactoryPatternDemo 类使用 FactoryProducer 来获取 AbstractFactory 对象。它将向 AbstractFactory 传递形状信息 ShapeCIRCLE / RECTANGLE / SQUARE以便获取它所需对象的类型。同时它还向 AbstractFactory 传递颜色信息 ColorRED / GREEN / BLUE以便获取它所需对象的类型。 步骤 1 为形状创建一个接口。
Shape.java
public interface Shape {void draw();
}步骤 2 创建实现接口的实体类。
Rectangle.javaRectangle.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.