关于java:Java基础一一设计模式工厂模式的运用

34次阅读

共计 3256 个字符,预计需要花费 9 分钟才能阅读完成。

工厂模式

工厂模式(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>

正文完
 0