Java抽象工厂模式是一种创建型设计模式,它提供了一种方法来创建相关或依赖对象的家族,而不需要明确指定具体的类。它是一种对象创建型模式,因为它使用工厂方法来创建对象。
Java抽象工厂模式有三个主要部分:
Java抽象工厂模式可以帮助我们在不必指定所要创建的具体对象的情况下,创建多个相关的对象。这样可以减少耦合性并使代码变得可重复使用、可扩展性好。此外,这也有助于保证代码中不存在冗余代码。
public abstract class AbstractFactory { public abstract AbstractProductA createProductA(); public abstract AbstractProductB createProductB(); } public class ConcreteFactory1 extends AbstractFactory { @Override public AbstractProductA createProductA() { return new ProductA1(); } @Override public AbstractProductB createProductB() { return new ProductB1(); } }
抽象工厂模式是另一个创建模式。
抽象工厂模式,也称为工厂的工厂,有一个工厂创建其他工厂。
当使用抽象工厂模式时,我们首先使用超级工厂创建工厂,然后使用创建的工厂创建对象。
下面的代码展示了如何使用抽象工厂模式。
我们将要创建形状和打印机。对于形状,我们会有圆形,矩形和正方形。对于打印机,我们将有纸张打印机,网络打印机和屏幕打印机。
对于shape,我们将创建Shape界面,如下所示:
interface Shape { void draw(); }
然后我们创建实现Shape接口的具体类。
class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); } } class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); } } class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); } }
我们为打印机创建一个界面。
interface Printer{ void print(); }
然后我们创建实现Printer接口的具体类。
class PaperPrinter implements Printer{ @Override public void print() { System.out.println("paper"); } } class WebPrinter implements Printer{ @Override public void print() { System.out.println("web"); } } class ScreenPrinter implements Printer{ @Override public void print() { System.out.println("screen"); } }
最后,我们创建一个抽象类来获取打印机和形状对象的工厂。
abstract class AbstractFactory { abstract Printer getPrinter(String type); abstract Shape getShape(String shape) ; }
最后,我们创建Factory类,根据给定的信息扩展AbstractFactory以生成具体类的对象。
class ShapeFactory extends AbstractFactory { @Override 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; } @Override Printer getPrinter(String type) { return null; } } class PrinterFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ return null; } @Override Printer getPrinter(String type) { if(type == null){ return null; } if(type.equalsIgnoreCase("paper")){ return new PaperPrinter(); } else if(type.equalsIgnoreCase("web")){ return new WebPrinter(); } else if(type.equalsIgnoreCase("Screen")){ return new ScreenPrinter(); } return null; } }
创建一个Factory生成器/生产器类,通过传递Shape或Printer等信息来获取工厂。
class FactoryProducer { public static AbstractFactory getFactory(String choice){ if(choice.equalsIgnoreCase("SHAPE")){ return new ShapeFactory(); } else if(choice.equalsIgnoreCase("Printer")){ return new PrinterFactory(); } return null; } }
下面的代码展示了如何使用抽象工厂模式。
public class Main { public static void main(String[] args) { //get shape factory AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); //get an object of Shape Circle Shape shape1 = shapeFactory.getShape("CIRCLE"); //call draw method of Shape Circle shape1.draw(); //get an object of Shape Rectangle Shape shape2 = shapeFactory.getShape("RECTANGLE"); //call draw method of Shape Rectangle shape2.draw(); //get an object of Shape Square Shape shape3 = shapeFactory.getShape("SQUARE"); //call draw method of Shape Square shape3.draw(); //get printer factory AbstractFactory printerFactory = FactoryProducer.getFactory("printer"); Printer printer1 = printerFactory.getPrinter("Paper"); printer1.print(); Printer printer2 = printerFactory.getPrinter("Web"); printer2.print(); Printer printer3 = printerFactory.getPrinter("Screen"); printer3.print(); } }
上面的代码生成以下结果。
Java设计模式 -责任链模式责任链模式为请求创建一个接收者对象列表。这种模式是行为模式。当使用责任链模式时,通常每个接收器包...
Java设计模式 - 组合模式组合模式是结构型模式,因为它创建了一组对象的树结构。 组合模式将一组对象视为单个对象。组合模式使用...
Java设计模式 - 单例模式单例模式是一种创建模式。这种模式只涉及一个单独的类,它负责创建自己的对象。该类确保只创建单个对象...
Java设计模式 - 数据访问对象模式数据访问对象模式或DAO模式将数据访问API与高级业务服务分离。DAO模式通常具有以下接口和类。数...
Java面向对象设计 -Java方法返回修饰符,返回类型和参数名称不是签名的一部分。方法的签名唯一地标识类中的方法。不允许在具有相...