1 Aperçu
Le modèle Builder (Builder Pattern) est principalement utilisé pour « construire un objet complexe étape par étape », dans lequel « étape par étape » est un algorithme stable, tandis que les différentes parties de l'objet complexe changent fréquemment. Par conséquent, le modèle de construction est principalement utilisé pour résoudre les exigences changeantes de la « partie objet ». Cela permet un contrôle plus fin du processus de construction d’objets.
2 exemples
En prenant comme exemple la production de téléphones mobiles, chaque téléphone mobile est divisé en écran, processeur et batterie. Il existe désormais deux types de téléphones mobiles à produire, Apple et Samsung.
pomme:
Copiez le code comme suit :
paquet org.scott.builder.before.use ;
importer java.util.ArrayList ;
importer java.util.List ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
classe publique ApplePhone {
List<String> parts = new ArrayList<String>();
public void createCPU() {
parts.add("CUP : Qualcomm");
}
public void createScreen() {
parts.add("ÉCRAN : JDI");
}
public void createBattery() {
parts.add("BATTERIE : DeSai");
}
public void show(){
System.out.print("Informations sur les composants du produit :");
pour (Partie de chaîne : parties) {
System.out.print(part + "/t");
}
}
}
Samsung :
Copiez le code comme suit :
paquet org.scott.builder.before.use ;
importer java.util.ArrayList ;
importer java.util.List ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
classe publique SamsungPhone {
List<String> parts = new ArrayList<String>();
public void createCPU() {
parts.add("TASSE : MTK");
}
public void createScreen() {
parts.add("ÉCRAN : Samsung");
}
public void createBattery() {
parts.add("BATTERIE : DeSai");
}
public void show(){
System.out.print("Informations sur les composants du produit :");
pour (Partie de chaîne : parties) {
System.out.print(part + "/t");
}
}
}
Client test :
Copiez le code comme suit :
paquet org.scott.builder.before.use ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
classe publique BuilderTest {
ApplePhone statique privé iphone = new ApplePhone();
SamsungPhone statique privé samPhone = new SamsungPhone();
public static void main(String args[]){
iphone.createCPU();
iphone.createScreen();
iphone.createBattery();
iphone.show();
samPhone.createCPU();
samPhone.createScreen();
samPhone.createBattery();
samPhone.show();
}
}
Avez-vous trouvé un problème ? Autrement dit, chaque processus de production de téléphones mobiles est le même. Pour être précis, les noms des processus sont les mêmes, mais le traitement spécifique de chaque processus est différent. Il n'y a que quelques étapes spécifiques. le traitement de chaque changement de processus, à partir de là, nous pouvons extraire l'immuable, "inchangé pour faire face à tous les changements", et transmettre la modification à des produits spécifiques.
Comment le faire concrètement ? Cette fois, le mode Builder est pratique.
Tout d’abord, jetons un coup d’œil à l’interface du téléphone :
Copiez le code comme suit :
paquet org.scott.builder.after.use ;
importer java.util.ArrayList ;
importer java.util.List ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
classe abstraite publique Téléphone {
protected List<String> parts = new ArrayList<String>();
public void add (partie chaîne) {
parts.add(partie);
}
public void show(){
System.out.print("Informations sur les composants du produit :");
pour (Partie de chaîne : parties) {
System.out.print(part + "/t");
}
}
}
Catégorie de téléphone mobile Apple :
Copiez le code comme suit :
paquet org.scott.builder.after.use ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
ApplePhone de classe publique étend le téléphone{
}
Catégorie de téléphone mobile Samsung :
Copiez le code comme suit :
paquet org.scott.builder.after.use ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
classe publique SamsungPhone étend le téléphone {
}
Définissez ensuite un constructeur d'interface pour l'étape de production :
Copiez le code comme suit :
paquet org.scott.builder.after.use ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
Générateur d'interface publique {
public void buildCPU();
public void buildScreen();
public void buildBattery();
Téléphone public getPhone();
}
Constructeur pour iPhone :
Copiez le code comme suit :
paquet org.scott.builder.after.use ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
classe publique ApplePhoneBuilder implémente Builder{
téléphone privé = new ApplePhone ();
@Outrepasser
public void buildCPU() {
phone.add("TASSE : Qualcomm");
}
@Outrepasser
public void buildScreen() {
phone.add("ÉCRAN : JDI");
}
@Outrepasser
public void buildBattery() {
phone.add("BATTERIE : DeSai");
}
@Outrepasser
téléphone public getPhone() {
retourner le téléphone ;
}
}
Constructeur pour téléphones mobiles Samsung :
Copiez le code comme suit :
paquet org.scott.builder.after.use ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
classe publique SamsungPhoneBuilder implémente Builder{
téléphone privé = nouveau SamsungPhone ();
@Outrepasser
public void buildCPU() {
phone.add("TASSE : MTK");
}
@Outrepasser
public void buildScreen() {
phone.add("ÉCRAN : Samsung");
}
@Outrepasser
public void buildBattery() {
phone.add("BATTERIE : DeSai");
}
@Outrepasser
téléphone public getPhone() {
retourner le téléphone ;
}
}
Directeur qui guide la production spécifique des téléphones mobiles :
Copiez le code comme suit :
paquet org.scott.builder.after.use ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
Directeur de classe publique {
Constructeur constructeur privé;
Directeur public (constructeur) {
this.builder = constructeur ;
}
construction publique vide(){
builder.buildCPU();
builder.buildScreen();
builder.buildBattery();
}
}
Enfin, écrivez une classe de test :
Copiez le code comme suit :
paquet org.scott.builder.after.use ;
/**
* @auteur Scott
* @version 20/11/2013
* @description
*/
classe publique BuilderTest {
constructeur statique privé iPhoneBuilder = new ApplePhoneBuilder();
constructeur statique privé samPhoneBuilder = new SamsungPhoneBuilder();
public static void main (String[] arguments) {
Directeur directeur = nouveau directeur (iPhoneBuilder);
directeur.construct();
Téléphone téléphone = iPhoneBuilder.getPhone();
System.out.println("iphone");
téléphone.show();
directeur = nouveau directeur (samPhoneBuilder);
directeur.construct();
téléphone = samPhoneBuilder.getPhone();
System.out.println("/nsamSung");
téléphone.show();
}
}
Résultats en cours d'exécution :
Copiez le code comme suit :
iPhone
Informations sur la pièce du produit : TASSE : Qualcomm ÉCRAN : JDI BATTERIE : DeSai
SamSung
Informations sur la pièce du produit : TASSE : MTK ÉCRAN : Samsung BATTERIE : DeSai
Les deux classes d'entité Phone ici sont vides. Si tel est le cas, elles peuvent être omises. Si l'interface Phone peut également être omise, seules les classes d'implémentation Director, Builder et spécifiques Builder sont laissées. De plus, la classe ApplePhone et la classe SamsungPhone sont deux classes liées. Ce sont des marques de téléphones mobiles différentes. Si vous rencontrez deux classes ou plus qui ne sont pas très liées, il n'est pas nécessaire que l'interface publique Phone existe. , Alors comment déterminer la valeur de retour de la méthode getPhone() spécifiée dans l'interface Builder ?
Que le type de valeur renvoyée soit ApplePhone ou SamsungPhone, des problèmes surgiront car les types de résultats renvoyés ne sont pas uniformes. À l'heure actuelle, Phone peut être défini comme une interface vide (une interface qui ne contient aucune méthode), puis laisser ces classes de produits spécifiques qui n'ont aucune relation les unes avec les autres implémenter cette interface, puis le type de valeur de retour de getPhone(. ) méthode spécifiée dans l'interface Builder. C'est toujours un type Phone, qui résout le problème. Cependant, dans ce cas, il n’est pas nécessaire d’utiliser le mode Builder.