工厂模式
一、工厂模式概念
工厂模式:使得对象的创建和使用它的客户解耦。
简单工厂:简单的把创建对象的方法封装到一个类中。
工厂方法:在基类中声明创建对象的方法,子类中实现。
抽象工厂:定义一组统一的创建对象的接口。
区别:虽然三者都可以解耦,但是工厂方法和抽象工厂比简单工厂更加富有弹性,工厂方法针对单一对象,抽象工厂针对一组对象。
二、简单工厂
SimpleFactory.java
public class SimpleFactory { public Pizza create() { return new Pizza1(); } }
Test.java
public class Test { public static void main(String[] args) { SimpleFactory f = new SimpleFactory(); Pizza p = f.create(); System.out.println(p); } }
其实简单工厂并不是一种真正的设计模式,称其为一种编程习惯更为恰当。我们可以看到简单工厂仅仅是把创建对象的方法封装起来,虽然能够做到创建与使用的解耦,但是却把代码写死了,适合小面积的临时使用。
三、工厂方法
(1)UML图
在基类中声明一个抽象方法,由子类去实现,由orderPizza()调用,调用的结果由子类决定。
(2)代码
PizzaStore.java
public abstract class PizzaStore { public void orderPizza() { Pizza p = create(); System.out.println(p); } public abstract Pizza create(); }
PizzaStore1.java
public class PizzaStore1 extends PizzaStore{ public Pizza create() { return new Pizza1(); } }
PizzaStore2.java
public class PizzaStore2 extends PizzaStore{ public Pizza create() { return new Pizza2(); } }
Test.java
public class Test { public static void main(String[] args) { PizzaStore p1 = new PizzaStore1(); PizzaStore p2 = new PizzaStore2(); p1.orderPizza(); p2.orderPizza(); } }
我们可以看到工厂方法的特点,用来创建单一的对象,它相对于简单工厂来说更加有弹性,在不同的pizza店我们可以订购不同的pizza。
四、抽象工厂
(1)UML图
可见抽象工厂与简单工厂的区别在于抽象工厂将创建对象的方法抽象封装在了一个接口当中,因此具有接口带来的优势,即运行时多态和更加富有弹性。