一、工厂模式
属于Java设计模式创建者模式的一种。在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
二、代码示例
场景:花店有不同的花,通过工厂模式来获取花。
1、普通工厂模式
逻辑步骤:
(1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
(2)、创建规范的工厂类,封装创建实体对象的方法,只需要根据提供的基础信息就能区别出需要返回的实体对象。
(3)、创建工厂的示例,使用工厂的创建方法创建需要的对象。
逻辑关系:
代码示例:
// 定义花的抽象接口,每一种花都要遵循此规范
public interface Flower {// 描述花的信息String desc();
}
// 实现类1,玫瑰花
public class Rose implements Flower {@Overridepublic String desc() {return "玫瑰花";}
}
// 实现类2,牡丹花
public class Peony implements Flower {@Overridepublic String desc() {return "牡丹花";}
}
// 定义花的创建工厂类
public class FlowerFactory {// 根据花的名称返回创建对象public Flower createFlower(String message){if ("玫瑰".equals(message)){return new Rose();} else {return new Peony();}}
}
// 测试类
public class ZTest {public static void main(String[] args) {FlowerFactory flowerFactory = new FlowerFactory();Flower flower = flowerFactory.createFlower("玫瑰");System.out.println(flower.desc());flower = flowerFactory.createFlower("牡丹");System.out.println(flower.desc());}
}
运行结果:
由运行结果看到,只要对工厂类提供基础的信息描述文字,就能得到对应的花的实体对象。
总结:
仅定义一个工厂用于创建所有可能的实例,根据描述信息创建对应的实例(相当于知道的花的名称,然后去找花店得到花)。
2、抽象工厂示例
逻辑步骤:
(1)、创建实体类统一的规范接口,之后创建的实体类都要实现这个接口
(2)、创建抽象的规范工厂(抽象类),定义统一的创建方法(抽象方法)
(3)、创建每一种实体的工厂类,实现规范工厂的抽象方法用来创建对应的实例对象
(4)、定义抽象工厂,不同场景下构建不同的实例工厂来创建对象
逻辑关系:
代码示例:
// 定义花的抽象接口,每一种花都要遵循此规范
public interface Flower {// 描述花的信息String desc();
}
// 实现类1,玫瑰花
public class Rose implements Flower {@Overridepublic String desc() {return "玫瑰花";}
}
// 实现类2,牡丹花
public class Peony implements Flower {@Overridepublic String desc() {return "牡丹花";}
}// 定义抽象工厂和抽象创建方法
public abstract class FlowerFactory {abstract Flower createFlower();
}
// 定义玫瑰的实例工厂,实现抽象工厂
public class RoseFactory extends FlowerFactory {public Flower createFlower(){return new Rose();};
}
// 定义牡丹的实例工厂,实现抽象工厂
public class PeonyFactory extends FlowerFactory {public Flower createFlower(){return new Peony();};
}
// 测试方法
public class ZTest {public static void main(String[] args) {FlowerFactory flowerFactory = new RoseFactory();Flower flower = flowerFactory.createFlower();System.out.println(flower.desc());flowerFactory = new PeonyFactory();flower = flowerFactory.createFlower();System.out.println(flower.desc());}
}
运行结果
总结:
需要定义一个抽象工厂,和每一种花的实例工厂用于创建自身的实例(相当于知道了花店的地址,这个花店只卖这一种花的情况)。
三、普通工厂和抽象工厂对比
两种方法都实现了封装创建实例的功能。
但是普通工厂模式违反了单一职责的原则(一个类只干一种事情),且随着花的实例品种越来越多,每一次都要修改工厂类才能添加新的花品种,相对而言是改动是比较大的也比较麻烦的。
抽象工厂模式,很好的规避了普通工厂的这两个缺点,新增花的品种,只要添加新的花品种的工厂类即可,但是这种方式会造成有非常多的类需要维护,不方便于代码的管理和维护。
总结来说,工厂模式和抽象工厂模式都有其独特的优点和适用场景。工厂模式适用于创建单个对象的情况,而抽象工厂模式适用于创建一系列相关的产品对象。在选择使用哪种模式时,应根据具体的业务需求和系统架构进行权衡和选择。
学海无涯苦作舟!!!