Abstract factory is a kind of creation pattern. The abstract degree of factory class pattern is simple factory pattern, factory pattern and abstract factory pattern.
Intent: provide an interface to create a series of related or interdependent objects without specifying their specific classes.
For example
If you don’t understand the above intention introduction, it doesn’t matter. Design patterns need to be used in daily work. Combining with examples can deepen your understanding. Now I’ve prepared three examples to let you understand what scenarios will use this design pattern.
Automobile factory
We all know that there are many parts in the automobile. With the division of labor brought about by the industrial revolution, many parts can be easily replaced. But in real life, we consumers are not willing to do this. We hope that the parts of the BMW we buy are all of the same series, so as to ensure the maximum matching degree and bring better performance and comfort.
Therefore, consumers are not willing to go to the tire factory, steering wheel factory and window factory to purchase one by one. Instead, they put the demand to the abstract factory BMW, which is responsible for assembly. You are the boss of this factory. As we all know, the components of a car are fixed, but different parts have different models and come from different manufacturers. You need to launch several different combinations of models to meet the needs of consumers at different prices. How would you design them?
maze game
You make a maze game. The known elements are room, door and wall. The combination relationship between them is fixed. You generate a random maze through a set of algorithms, which call the factory of room, door and wall to generate the corresponding instance. But with the release of the new expansion, you need to generate rooms with new functions (which can restore physical strength), doors with new functions (which can only be opened by magic keys) and walls with new functions (which can be destroyed by bombs). However, modifying the existing maze generation algorithm violates the principle of opening and closing (which needs to be modified in existing objects). If you want to generate maze algorithm, you will not feel it at all How would you design for the existence of new materials?
Event linkage
Suppose we do a front-end building engine, and now we want to do a set of association mechanism, so that we can click on the cell of the table component to pop up a modal box and display a line chart inside. It is known that the business side needs to customize the table component, modal box component and line chart component, but the linkage between components is certain. How would you design it?
Interpretation of intention
In the case of a car factory, we know the components of a car,In order to assemble a car, the parts need to be assembled in a certain way, and the specific parts need to be expandable。
In the example of maze game, we know that the components of maze are room, door and wall,In order to generate a maze, we need to use some algorithm to generate many instances of rooms, doors and walls. The algorithm does not care about which rooms, doors and walls to use, and it needs to be expanded。
In the case of event linkage, we know that the basic elements of the Interaction scenario of this table pop-up trend chart are table component, modal box component and line chart component,We need to use some linkage mechanism to create linkage relationship among the three. What table, modal box component and line chart component are not concerned by this event linkage, and they need to be expanded, the form can be replaced by the form registered by any business party, as long as it meets the requirements of clickonClick
The mechanism is fine.
Intent: provide an interface to create a series of related or interdependent objects without specifying their specific classes.
Aren’t these three examples in line with the above intention? The abstract factory we want to design is toCreate a series of related or interdependent objectsIn the above examples, they are automobile components, maze game materials and event linkage components.There is no need to specify their specific classesThis means that we don’t care what brand the car’s steering wheel is made of, whether the maze room is an ordinary room, and whether the broken line diagram of the linkage mechanism is usedEcharts
We just need to describe the relationship between them,The advantage of this is that we don’t need to modify the abstract factory when we expand new steering wheel, new room and new line chart in the future.
Structure chart
AbstractFactory
This is the abstract factory we want. It describes the abstract relationship of creating products, such as how to generate mazes and how to link tables and trend charts.
As for the specific steering wheel and room, it is decided by theConcreteFactory
So we may have multipleConcreteFactory
For exampleConcreteFactory1
The instantiated wall is an ordinary wall,ConcreteFactory2
The instantiated wall is a magic wall, but its effect onAbstractFactory
The interface is consistent, soAbstractFactory
You don’t need to care which factory you call.
AbstractProduct
Is the product abstract class, which describes the creation methods of such as steering wheel, wall and line chartConcreteProduct
It’s a specific way to realize the product, such asConcreteProduct1
The created form is created usingcanvas
Yes, the line chart is in ChineseG2
It’s painted, not paintedConcreteProduct2
The created form is created usingdiv
Yes, the line chart is in ChineseEcharts
It was painted.
In this way, when we want to expand a useRcharts
Draw a line chart withsvg
Draw a table withdiv
When drawing the event mechanism composed of modal boxes, you only need to create another oneConcreteFactory3
Do the corresponding implementation, and then put thisConcreteFactory3
Pass on toAbstractFactory
There is no need to modifyAbstractFactory
The method itself.
Code examples
The following example is written in JavaScript.
class AbstractFactory {
createProducts(concreteFactory: ConcreteFactory) {
const productA = concreteFactory.createProductA();
const productB = concreteFactory.createProductB();
//Establish a fixed association between ﹣ a ﹣ and ﹣ B ﹣ even if the implementation of ﹣ a ﹣ and ﹣ B ﹣ is replaced by any implementation, it will not be affected
productA.bind(productB);
}
}
productA.bind(productB)
It is an abstract representation
- For the example of automobile factory, it shows the process of assembling automobile.
- For the example of maze game, it shows the process of generating maze.
- For the example of event linkage, it represents the process of creating association between components.
Suppose we have two sets of materials in our maze, namely ordinary material and magic material. As long as we create ordinary material factories in our mazeConcreteFactoryA
, and magic material factoryConcreteFactoryB
, callcreateProducts
When the input is ordinary material, the output is the maze built by ordinary material. When the input is magic material, the output is the maze built by magic material.
When we want to create a new set of maze materials, such as lava maze, we just need to create a set of lava materials (lava room, lava door, lava wall), and then assemble oneConcreteFactoryC
Lava material generation plant passes toAbstractFactory.createProducts
That’s it.
We can find that using the abstract factory mode, we can easily expand new materials, such as a new set of auto parts, a new set of maze materials, and a new set of event linkage components,This process only needs to create a new class, does not need to modify any class, in line with the open close principle。
malpractice
Any design pattern has its applicable scenarios, which in turn indicates that it is not applicable in some scenarios.
Or the above example, if our demand is not to expand a new wheel, new wall, new line chart, but to:
- The car factory has to add a new component to the car: the autopilot system.
- Maze game to add a functional material: trap.
- Event linkage needs to add a new linkage object: detailed trend statistics table.
You see, this situation is not to add a new set of implementations for the existing elements, but to implement some new elements, which will be very complicated, because we not only need to add a new set of implementations for all elementsConcreteFactory
Each element is added and the abstract factory is modified to establish a connection between the new element and the old element, which violates the open close principle.
Therefore, for the system with fixed elements, it is suitable to use abstract factory, otherwise it is not.
summary
Abstract factory is applicable to the implementation of a new existing product, but not to a new product category. You can refer to the following figure combined with an example for further understanding
How to expand a lava material packageAdd a product styleIt is suitable to use abstract factory design patternAdd a product category, not suitable for using abstract factory design pattern. Why? Look at the picture below
Creating labyrinth is what the abstract factory does,It is to associate existing rooms, doors and wallsBecause the operation is abstract class, it is easy to expand a set of concrete implementation (lava material package) without perception of this abstract factory.
However, if a new product category trap is added, we can see that the abstract factory must re-establish the association between the trap and the first three, which means modifying the abstract factory, which does not conform to the open close principle. At the same time, if we have material package 1 ~ 999, we need to add 999 corresponding traps (ordinary traps, magic traps, lava traps) at the same time, and the workload will be very heavy.
Therefore, the abstract factory design pattern is suitable only when the product type is stable and the product style needs to be expanded frequently.
The address for discussion is: Intensive Reading of “design pattern abstract factory abstract factory” · issue # 271 · DT Fe / weekly
If you want to participate in the discussion, please click here. There are new topics every week, which will be released on weekends or Mondays. Front end intensive reading – help you screen reliable content.
followFront end intensive reading WeChat official account
Copyright notice: free reproduction – non commercial – non derivative – keep signature (Creative sharing 3.0 License)