工厂模式划分来说总共有三类:简单工厂模式、工厂方法模式和抽象工厂模式。其中简单工厂模式不输入23种设计模式之一,但他们又都属于创建型
模式。我们依次讲解这三种工厂模式。
首先来说简单工厂,简单工厂模式,又叫做静态工厂模式(Static Factory Method),由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。属于创建型
模式,但不属于GOF23设计模式。
工厂类负责创建的对象比较少;客户端(应用层)只需要知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。
首先来看类图:
代码实现:
public class ShapeFactory { public Shape getShape(String shapeType){ if(shapeType.equalsIgnoreCase("circle")){ return new Circle(); }else if(shapeType.equalsIgnoreCase("rectangle")){ return new Rectangle(); }else if(shapeType.equalsIgnoreCase("squere")){ return new Squere(); } return null; } public Shape getShape(Class clazz) throws Exception{ return (Shape) clazz.newInstance(); } }
工厂方法模式(Factory Method),又称多态性工厂模式,属于设计模式三大分类中的创建型模式
,作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂模式让实例化推迟到子类。如类图所示:
在工厂模式中,核心的工厂类不再负责所有的产品的创建,而是将具体的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品应当被实例化这种细节。
工厂方法模式非常符合“开闭原则”,当需要增加一个新产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必就会导致系统的复杂度增加。
public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { System.out.println("画一个圆"); } } public class Rectangle implements Shape { @Override public void draw() { System.out.println("画一个矩形"); } }
代码(工厂部分):
public abstract class ShapeFactory { public abstract Shape getShape(); } public class CircleFactory extends ShapeFactory { @Override public Shape getShape() { return new Circle(); } } public class RectangleFactroy extends ShapeFactory { @Override public Shape getShape() { return new Rectangle(); } }
工厂方法模式通常适用于以下场景。
当需要生成的产品不多且不会增加,一个具体工厂类就可以完成任务时,可删除抽象工厂类。这时工厂方法模式将退化到简单工厂模式,其结构图如图所示:
抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
使用抽象工厂模式一般要满足以下条件。
抽象工厂模式的主要角色如下。
抽象工厂模式结构图如图所示:
抽象工厂模式最早的应用是用于创建属于不同操作系统的视窗构件。如 java 的 AWT 中的 Button 和 Text 等构件在 Windows 和 UNIX 中的本地实现是不同的。
抽象工厂模式通常适用于以下场景:
抽象工厂模式的扩展有一定的“开闭原则”倾斜性:
另一方面,当系统中只存在一个等级结构的产品时,抽象工厂模式将退化到工厂方法模式。
原文:https://www.cnblogs.com/jing99/p/12595494.html