工厂模式
工厂模式(Factory Pattern)是 Java 中最罕用的设计模式之一。这种类型的设计模式属于创立型模式,它提供了一种创建对象的最佳形式。
在工厂模式中,咱们在创建对象时不会对客户端裸露创立逻辑,并且是通过应用一个独特的接口来指向新创建的对象。
介绍
用意: 定义一个创建对象的接口,让其子类本人决定实例化哪一个工厂类,工厂模式使其创立过程提早到子类进行。
次要解决: 次要解决接口抉择的问题。
何时应用: 咱们明确地打算不同条件下创立不同实例时。
如何解决: 让其子类实现工厂接口,返回的也是一个形象的产品。
要害代码: 创立过程在其子类执行。
利用实例: 1、您须要一辆汽车,能够间接从工厂外面提货,而不必去管这辆汽车是怎么做进去的,以及这个汽车外面的具体实现。2、Hibernate 换数据库只需换方言和驱动就能够。
长处: 1、一个调用者想创立一个对象,只有晓得其名称就能够了。2、扩展性高,如果想减少一个产品,只有扩大一个工厂类就能够。3、屏蔽产品的具体实现,调用者只关怀产品的接口。
毛病: 每次减少一个产品时,都须要减少一个具体类和对象实现工厂,使得零碎中类的个数成倍增加,在肯定水平上减少了零碎的复杂度,同时也减少了零碎具体类的依赖。这并不是什么坏事。
应用场景: 1、日志记录器:记录可能记录到本地硬盘、零碎事件、近程服务器等,用户能够抉择记录日志到什么中央。2、数据库拜访,当用户不晓得最初零碎采纳哪一类数据库,以及数据库可能有变动时。3、设计一个连贯服务器的框架,须要三个协定,”POP3″、”IMAP”、”HTTP”,能够把这三个作为产品类,独特实现一个接口。
注意事项: 作为一种创立类模式,在任何须要生成简单对象的中央,都能够应用工厂办法模式。有一点须要留神的中央就是简单对象适宜应用工厂模式,而简略对象,特地是只须要通过 new 就能够实现创立的对象,无需应用工厂模式。如果应用工厂模式,就须要引入一个工厂类,会减少零碎的复杂度。
实现
咱们将创立一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
FactoryPatternDemo 类应用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。
步骤 1
创立一个接口:
Shape.java
public interface Shape {void draw(); }
步骤 2
创立实现接口的实体类。
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {System.out.println("Inside Rectangle::draw() method.");
} }
Square.java
public class Square implements Shape {
@Override
public void draw() {System.out.println("Inside Square::draw() method.");
} }
Circle.java
public class Circle implements Shape {@Override public void draw() {System.out.println("Inside Circle::draw() method.");
} }
步骤 3
创立一个工厂,生成基于给定信息的实体类的对象。
ShapeFactory.java
public 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.java
public 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
执行程序,输入后果:
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm"
lang=""cid="n42"mdtype="fences"style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.
</pre>