工厂模式
(工厂模式) 工厂将创建对象的细节抽离出来,实现对修改关闭。
定义
==工厂方法模式==定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
工厂方法模式中的重要原则:依赖倒置原则
如何避免违反依赖倒置原则
- 变量不可以持有具体类的引用
- 不要让类派生自具体类
- 不要覆盖基类中已实现的方法
简单工厂模式
简单工厂模式将创建对象的细节进行封装,但是每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。
简单工厂模式结构如下:
- 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
- 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
- 具体产品(ConcreteProduct):是简单工厂模式的创建目标。
代码实现:
-
抽象产品
public interface Pizza { void name(); }
-
具体产品
public class ClamPizza implements Pizza{ @Override public void name() { System.out.println("clam pizza"); } } public class VeggiePizza implements Pizza { @Override public void name() { System.out.println("veggie pizza"); } }
-
简单工厂
public class PizzaFactory { public static Pizza getPizza(String type) { if ("clam".equals(type)) { return new ClamPizza(); } else if ("veggie".equals(type)) { return new VeggiePizza(); } else { return null; } } }
-
测试代码
public class PizzaTestDrive { public static void main(String[] args) { Pizza clam = PizzaFactory.getPizza("clam"); Pizza veggie = PizzaFactory.getPizza("veggie"); clam.name(); veggie.name(); } }
-
结果输出
clam pizza veggie pizza
工厂方法模式
工厂方法模式是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。
工厂方法模式结构如下:
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
- 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
代码实现:
-
抽象产品
public interface Pizza { void name(); }
-
具体产品
public class ClamPizza implements Pizza{ @Override public void name() { System.out.println("clam pizza"); } } public class VeggiePizza implements Pizza { @Override public void name() { System.out.println("veggie pizza"); } }
-
抽象工厂
public interface PizzaFactory { Pizza getPizza(); }
-
具体工厂
public class ClamFactory implements PizzaFactory { @Override public Pizza getPizza() { return new ClamPizza(); } } public class VeggieFactory implements PizzaFactory { @Override public Pizza getPizza() { return new VeggiePizza(); } }
-
测试代码
public class PizzaTestDrive { public static void main(String[] args) { Pizza clam = new ClamFactory().getPizza(); Pizza veggie = new VeggieFactory().getPizza(); clam.name(); veggie.name(); } }
-
结果输出
clam pizza veggie pizza
抽象工厂模式
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中被解耦。
抽象工厂模式结构如下:
抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。
- 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
- 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。