2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Factory Pattern est un modèle de conception couramment utilisé dans la programmation orientée objet.modèle de création type de.Le modèle d'usine est principalement utilisé pour créer des objets, mais il est différent de son utilisation directe dans le code.new
La création de mots-clés est différente dans la mesure où elle crée des objets via une interface commune, séparant ainsi le processus de création d'objets de l'utilisation du code client. Ce qui suit est une introduction détaillée au modèle d'usine :
Les modèles d'usine sont principalement divisés en trois types : le modèle d'usine simple (modèle d'usine statique), le modèle de méthode d'usine et le modèle d'usine abstrait.
Diagramme de classe de modèle d'usine simple
Modèle de méthode d'usine
modèle d'usine abstrait
Le modèle d'usine a un large éventail d'applications en développement réel, telles que les connexions de bases de données, les contrôles d'interface utilisateur, le traitement de fichiers, la journalisation, les communications réseau, les files d'attente de messages, les structures de données, le cryptage et le déchiffrement, l'envoi de messages et la planification de tâches. Dans ces scénarios, l'utilisation du modèle d'usine peut séparer le processus de création d'objet du processus d'utilisation, améliorant ainsi la flexibilité et l'évolutivité du système.
Dans le modèle de fabrique simple, nous définissons une classe de fabrique qui peut renvoyer des instances de différents types en fonction des paramètres transmis.
Vous trouverez ci-dessous un exemple de modèle d'usine simple écrit en Java. Nous allons créer une usine de formes capable de produire des instances de cercles, de rectangles et de carrés. Tout d’abord, nous définissons une interface de forme (Shape) et plusieurs classes concrètes (Circle, Rectangle, Square) qui implémentent cette interface.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- 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.");
- }
- }
Ensuite, nous définissons une classe d'usine (ShapeFactory) qui utilise des méthodes statiques pour générer des objets de forme.
- // 形状工厂类
- class ShapeFactory {
-
- // 使用 getShape 方法获取形状类型的对象
- public static 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;
- }
- }
Enfin, nous pouvons utiliser une classe d'usine pour obtenir des objets de forme et appeler leurdraw
méthode.
- public class FactoryPatternDemo {
-
- public static void main(String[] args) {
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = ShapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 获取 Rectangle 的对象,并调用它的 draw 方法
- Shape shape2 = ShapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 获取 Square 的对象,并调用它的 draw 方法
- Shape shape3 = ShapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
Dans cet exemple,ShapeFactory
la classe est responsable de la créationShape
Une instance de l'interface.Le code client fait cela en transmettant des informations de type (par exemple une chaîne) àShapeFactory
méthode de classe statiquegetShape
pour obtenir une instance de la forme souhaitée. De cette façon, le client est découplé de l'implémentation de la classe spécifique et respecte le principe d'ouverture et de fermeture, c'est-à-dire que de nouvelles classes de formes peuvent être étendues sans modifier le code client. Cependant, un inconvénient majeur du modèle d'usine simple est que si le système doit être étendu avec de nouvelles familles de produits (comme des couleurs en plus des formes, etc.), la classe d'usine doit être modifiée, ce qui viole une partie du principe ouvert. -principe fermé. Dans ce cas, envisagez d’utiliser le modèle Factory Method ou le modèle Abstract Factory.
Toujours à titre d'exemple, nous utilisons des méthodes d'ingénierie pour le créer.
Définissez d’abord l’interface de forme (Produit) et créez trois classes d’implémentation.
- // 形状接口
- interface Shape {
- void draw();
- }
-
- // 圆形类
- class Circle implements Shape {
- @Override
- public void draw() {
- System.out.println("Inside Circle::draw() method.");
- }
- }
-
- // 矩形类
- 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.");
- }
- }
Ensuite, définissez l'interface du créateur (Creator) et du créateur concret (Concrete Creator) :
- // 创建者接口
- interface ShapeFactory {
- Shape getShape(String shapeType);
- }
-
- // 具体创建者类
- class RectangleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("RECTANGLE")) {
- return new Rectangle();
- }
- return null;
- }
- }
-
- class CircleFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("CIRCLE")) {
- return new Circle();
- }
- return null;
- }
- }
-
- class SquareFactory implements ShapeFactory {
- @Override
- public Shape getShape(String shapeType) {
- if (shapeType == null) {
- return null;
- }
- if (shapeType.equalsIgnoreCase("SQUARE")) {
- return new Square();
- }
- return null;
- }
- }
Enfin, utilisez la classe de création concrète pour obtenir les objets de forme et appeler leurdraw
méthode:
- public class FactoryMethodPatternDemo {
-
- public static void main(String[] args) {
- ShapeFactory shapeFactory = new CircleFactory();
-
- // 获取 Circle 的对象,并调用它的 draw 方法
- Shape shape1 = shapeFactory.getShape("CIRCLE");
- shape1.draw();
-
- // 使用 RectangleFactory 来获取 Rectangle 的对象
- shapeFactory = new RectangleFactory();
- Shape shape2 = shapeFactory.getShape("RECTANGLE");
- shape2.draw();
-
- // 使用 SquareFactory 来获取 Square 的对象
- shapeFactory = new SquareFactory();
- Shape shape3 = shapeFactory.getShape("SQUARE");
- shape3.draw();
- }
- }
Dans cet exemple,Nous créons une classe d'usine correspondante pour chaque classe de forme (Bien que dans les applications réelles, il y aura généralement une structure de classe d'usine plus générale, peut-être via des fichiers de configuration ou une réflexion pour éviter d'écrire des classes d'usine distinctes pour chaque classe de produit). Cela permet de démontrer les principes de base du modèle Factory Method,Autrement dit, laissez la sous-classe d'usine décider quelle classe instancier . Cependant, pour le cas simple de cet exemple, vous pourriez être plus enclin à utiliser le modèle Simple Factory ou à envisager d'autres modèles de conception pour réduire la duplication de code.
Cet exemple prend les téléphones mobiles comme exemple, abstrait les produits liés aux téléphones mobiles (tels que les écrans, les batteries, les systèmes d'exploitation, etc.) et crée des classes de produits spécifiques pour implémenter ces interfaces. Nous pouvons ensuite définir des interfaces d’usine abstraites et des classes d’usine concrètes pour produire ces produits. Voici un exemple simplifié montrant comment utiliser le modèle Abstract Factory pour produire des composants (écrans et batteries) pour différentes marques et modèles de téléphones mobiles :
Tout d’abord, définissez l’interface du produit et les produits spécifiques :
- // 屏幕接口
- interface Screen {
- void display();
- }
-
-
- // 高端屏幕的实现
- class HighEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示高清屏幕");
- }
- }
-
- // 低端屏幕的实现
- class LowEndScreen implements Screen {
- @Override
- public void display() {
- System.out.println("显示普通屏幕");
- }
- }
-
-
- // 电池接口
- interface Battery {
- void charge();
- }
-
-
- // 高效电池的实现
- class HighEfficiencyBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("快速充电");
- }
- }
-
- // 标准电池的实现
- class StandardBattery implements Battery {
- @Override
- public void charge() {
- System.out.println("标准充电");
- }
- }
Ensuite, définissez l'interface de fabrique abstraite et la classe de fabrique concrète :
- // 手机组件工厂接口
- interface PhoneFactory {
- Screen createScreen();
- Battery createBattery();
- }
-
- // 高端手机工厂
- class HighEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new HighEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new HighEfficiencyBattery();
- }
- }
-
- // 低端手机工厂
- class LowEndPhoneFactory implements PhoneFactory {
- @Override
- public Screen createScreen() {
- return new LowEndScreen();
- }
-
- @Override
- public Battery createBattery() {
- return new StandardBattery();
- }
- }
Enfin, le code client, qui utilise une usine abstraite pour créer des objets produits concrets :
- public class PhoneFactoryPatternDemo {
- public static void main(String[] args) {
- // 使用高端手机工厂
- PhoneFactory highEndFactory = new HighEndPhoneFactory();
- Screen highEndScreen = highEndFactory.createScreen();
- Battery highEndBattery = highEndFactory.createBattery();
-
- highEndScreen.display();
- highEndBattery.charge();
-
- // 使用低端手机工厂
- PhoneFactory lowEndFactory = new LowEndPhoneFactory();
- Screen lowEndScreen = lowEndFactory.createScreen();
- Battery lowEndBattery = lowEndFactory.createBattery();
-
- lowEndScreen.display();
- lowEndBattery.charge();
- }
- }
Dans cet exemple, nous définissons deux usines de téléphonie mobile (haut de gamme et bas de gamme), chacune capable de produire un type d'écran et de batterie spécifique.Le code client interagit avec la classe d'usine spécifique via l'interface d'usine abstraite, réalisant ainsi le découplage de la classe de produit spécifique. . De cette façon, si nous devons ajouter de nouveaux types de téléphones à l'avenir (par exemple, des téléphones de milieu de gamme), il nous suffit d'ajouter de nouvelles classes de produits et les classes d'usine correspondantes sans modifier le code client existant.
Le modèle d'usine est un modèle de conception très utile,Il encapsule le processus de création d'objets, réduit le couplage, améliore l'évolutivité du programme et la facilité de maintenance, etc. , a été largement utilisé dans le développement de logiciels.Cependant, il comporte également certainsInconvénients, tels que des responsabilités excessives de l'usine, des difficultés d'expansion du système, etc. . Par conséquent, dans les applications pratiques, des compromis et des choix doivent être faits en fonction de scénarios et de besoins spécifiques.
Si le modèle d'usine (usine simple, méthode d'usine, usine abstraite) vous est utile, pensez à l'aimer et à le collectionner.