Mô hình thiết kế - Mô hình nhà máy trừu tượng
Các mẫu nhà máy trừu tượng hoạt động xung quanh một siêu nhà máy tạo ra các nhà máy khác. Nhà máy này còn được gọi là nhà máy của các nhà máy. Loại mẫu thiết kế này thuộc mẫu sáng tạo vì mẫu này cung cấp một trong những cách tốt nhất để tạo một đối tượng.
Trong mẫu Abstract Factory, một giao diện chịu trách nhiệm tạo một nhà máy của các đối tượng liên quan mà không chỉ định rõ ràng các lớp của chúng. Mỗi nhà máy được tạo có thể cung cấp các đối tượng theo mẫu Nhà máy.
Thực hiện
Chúng ta sẽ tạo một giao diện Shape và một lớp cụ thể triển khai nó. Chúng ta tạo một lớp nhà máy trừu tượng AbstractFactory như bước tiếp theo. Lớp nhà máy ShapeFactory được định nghĩa, mở rộng AbstractFactory. Một lớp tạo nhà máy / trình tạo FactoryProductioner được tạo.
AbstractFactoryPatternDemo, lớp demo của chúng ta sử dụng FactoryProductioner để lấy một đối tượng AbstractFactory. Nó sẽ chuyển thông tin (CIRCLE / RECTANGLE / SQUARE cho Shape) đến AbstractFactory để lấy loại đối tượng mà nó cần.
Bước 1
Tạo giao diện cho Shapes.
Shape.java
public interface Shape {
void draw();
}
Bước 2
Tạo các lớp cụ thể triển khai cùng một giao diện.
RoundedRectangle.java
public class RoundedRectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside RoundedRectangle::draw() method.");
}
}
RoundedSquare.java
public class RoundedSquare implements Shape {
@Override
public void draw() {
System.out.println("Inside RoundedSquare::draw() method.");
}
}
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Bước 3
Tạo một lớp Trừu tượng để lấy các nhà máy cho các Đối tượng Hình dạng Thường và Hình tròn.
AbstractFactory.java
public abstract class AbstractFactory {
abstract Shape getShape(String shapeType) ;
}
Bước 4
Tạo các lớp Factory mở rộng AbstractFactory để tạo đối tượng của lớp cụ thể dựa trên thông tin đã cho.
ShapeFactory.java
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
}else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
RoundedShapeFactory.java
public class RoundedShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new RoundedRectangle();
}else if(shapeType.equalsIgnoreCase("SQUARE")){
return new RoundedSquare();
}
return null;
}
}
Bước 5
Tạo một lớp Nhà máy sản xuất / nhà sản xuất để nhận các nhà máy bằng cách chuyển một thông tin như Hình dạng
FactoryProductioner.java
public class FactoryProducer {
public static AbstractFactory getFactory(boolean rounded){
if(rounded){
return new RoundedShapeFactory();
}else{
return new ShapeFactory();
}
}
}
Bước 6
Sử dụng FactoryProductioner để lấy AbstractFactory để lấy các nhà máy của các lớp cụ thể bằng cách chuyển một thông tin như kiểu.
AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
//get shape factory
AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
//get an object of Shape Rectangle
Shape shape1 = shapeFactory.getShape("RECTANGLE");
//call draw method of Shape Rectangle
shape1.draw();
//get an object of Shape Square
Shape shape2 = shapeFactory.getShape("SQUARE");
//call draw method of Shape Square
shape2.draw();
//get shape factory
AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true);
//get an object of Shape Rectangle
Shape shape3 = shapeFactory1.getShape("RECTANGLE");
//call draw method of Shape Rectangle
shape3.draw();
//get an object of Shape Square
Shape shape4 = shapeFactory1.getShape("SQUARE");
//call draw method of Shape Square
shape4.draw();
}
}
Bước 7
Xác minh kết quả đầu ra.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside RoundedRectangle::draw() method.
Inside RoundedSquare::draw() method.