设计模式总体分为三大类:
创建型模式:工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式:适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型模式:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,备忘录模式,状态模式,访问者模式,中介模式,解释器模式。
工厂模式属于创建型模式,顾名思义就是将零件组装成产品的地方,也就是创建对象的工厂。
通常情况下,作为一个工厂的类有一个对象以及与它关联的多个方法。调用者使用某些参数调用此方法之后,工厂会根据参数创建所需类型的对象,然后将它们返回给调用者。
当我们明确地计划不同条件下创建不同实例时,就可以使用该设计模式
它具有那些优点呢,最大的就是松耦合,即对象的创建可以独立于类的实现,用户不需要了解创建对象的类,但是依然可以使用它来创建对象,它只需要知道需要传递的接口、方法和参数,就能够创建 所需类型的对象了,
Factory模式又分为简单工厂模式,工厂方法模式和抽象工厂模式,下面就具体的看一看他们的区别把
概念:允许接口创建对象,但不会暴露对象的创建逻辑,他和工厂方法模式类似,这里就不多赘述了
简单工厂有一个问题就是,对象的创建依赖于工厂类,这样想要扩展程序,必须对工厂类进行修改,违背了开闭原则(开闭原则就是对扩展开放,对修改关闭),所以,从设计的角度思考,这样的问题该如何解决呢?我们可以定义一个创建对象的抽象方法并创建多个不同的工厂类实现该抽象方法,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。这种方法也就是我们接下来要说的工厂方法模式。
概念:定义了一个创建对象的抽象方法,由子类决定要实例化的类,工厂方法模式将对象的实例化推给了子类。
1.创建一个接口
public interface Shape { void draw(); }
2.创建接口的实现类
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } }
public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } }
public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
3.创建一个工厂,生成基于给定的信息的实体类对象
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.使用该工厂,通过传递参数信息来获取实体类对象
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(); } }
//输出结果为 Inside Circle::draw() method. Inside Rectangle::draw() method. Inside Square::draw() method.
这个模式的好处就是,如果你现在想增加一个功能,只需做一个实现类就OK了,无需去改动现成的代码。这样做,拓展性较好!但是每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
抽象工厂模式的主要目的是提供一个接口来创建一系列相关对象,而无需指定具体的类。工厂方法将创建实例的任务委托给了子类,而抽象工厂方法的目标是创建一系列相关对象。