一、概念:
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,该模式可以使对象实例的使用者不需要了解该实例是怎么创建的,只需要告诉工厂我要什么,那么工厂就会给你生产对应的对象实例,用于解决创建类的实例出现很多重复代码的场景。其中包含简单工厂模式(Simple Factory),工厂方法模式(Factory Method),抽象工厂模式(Abstract Factory)三种模式,下面以简单工厂模式(Simple Factory)为例进行演示!
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。该模式对对象创建管理方式最为简单。该模式是由一个工厂对象决定创建出哪一种产品类的实例。该模式可以理解为是不同工厂模式的一个特殊实现。
其UML类图如下
(1)简单工厂模式组成:
工厂角色(Factory):简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。
工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品角色(Product):简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品角色(Concrete Product):是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
(2)优缺点:
优点:
在于工厂类中包含了必要的逻辑,根据客户需要的条件动态实例化相关的类,对客户端来说,去掉了与具体产品的依赖。
缺点:
工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,当增加新的东东时,会违反开放-封闭原则
(3)实现方式:
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
(4)代码实现:
抽象产品类(AbstractProduct):
public abstract class AbstractProduct {
//抽象产品角色
public abstract void use();
}
具体产品类(Concrete Product):
public class Plane extends AbstractProduct{
//具体产品角色(Plane)
public void use() {
System.out.println("正在使用飞机");
}
}
public class Car extends AbstractProduct{
//具体产品角色(Car)
public void use() {
System.out.println("正在使用汽车");
}
}
工厂类(Factory):
public class Factory {
//Factory提供一个静态的方法让外部访问并根据传入的参数,动态决定应该创建哪一个产品类
public static AbstractProduct Product(String product)throws Exception{
if("plane".equalsIgnoreCase(product)){
System.out.println("生产飞机");
return new Plane();
}else if("artillery".equalsIgnoreCase(product)){
System.out.println("生产汽车");
return new Car();
}else{
throw new Exception("无法生产此产品!!!");
}
}
}
测试类(Text):
public class Text {
public static void main(String[] args) throws Exception {
//1.实例化工厂
Factory factory = new Factory();
//2.调用工厂的produceProduct方法根据传入的参数,动态决定应该创建哪一个产品类
AbstractProduct producePlane = factory.Product("plane");
producePlane.use();
System.out.println("--------------------------------------------");
AbstractProduct produceCar = factory.Product("artillery");
produceCar.use();
}
}
运行结果: