Introducing the design patterns of [GoF](https://ja.wikipedia.org/wiki/Gang of for _ (Information Engineering)) ["Introduction to Design Patterns Learned in the Augmented and Revised Java Language"]( https://www.amazon.co.jp/ Augmented and revised edition Introduction to design patterns learned in Java language-Hiroshi Yuki / dp / 4797327030 / ref = pd_lpo_sbs_14_t_0? _ Encoding = UTF8 & psc = 1 & refRID = 2ZE4GPYNN55JGDR5QMHP) I will summarize about.
Translated into Japanese, it means "prototype".
The pattern ** that creates a new instance by copying (duplicate) another class using this ** prototype instance is called the ** Prototype pattern **.
Normally, new is used when creating an instance, but in the Prototype pattern, instead of new, use the clone
method defined in the java.lang.Object
class, which is a superclass of all classes. Create an instance.
The Prototype pattern is used by the classes that appear in the class diagram below.
createClone
method.
Implementation is done in the subclass ConcreatePrototype
class.ConcreatePrototype
Implements the createClone
method defined in the superclass Prototype
class.
Client
A class that uses the createClone
method.
As a concrete example, it will be explained based on the following class.
-** Product interface **
Product.java
package framework;
import java.lang.Cloneable;
// 1. java.lang.Inherit Cloneable
public interface Product extends Cloneable {
public abstract void display(String s);
//2.Declare createClone method
public abstract Product createClone();
}
The points are the following two points.
** 1. ** It inherits the java.lang.Cloneable
interface so that it can be copied with the clone
method.
** 2. ** Declaring the createClone
method.
I will give a supplementary explanation.
The clone
method is defined in the java.lang.Object
class, which is a superclass of all classes.
To execute this clone
method, the source class must implement the java.lang.Cloneable
interface.
If you do not implement the java.lang.Cloneable
interface, you will get a CloneNotSupportedException
exception.
Also, regarding the createClone
method, it is a method for using the clone
method, but implementation is done by the subclasses Surround
class and ʻUnderLine` class.
-** Client class **
Client.java
package framework;
import java.util.*;
public class Client {
private HashMap<String, Product> stringName = new HashMap<>();
// 1.Register with HashMap
public void register(String name, Product pro) {
stringName.put(name, pro);
}
// 2.Use createClone method
public Product create(String proname) {
Product p = (Product) stringName.get(proname);
return p.createClone();
}
}
The Client
class is a class for using the copy method.
The points are the following two points.
** 1. ** The instance that implements the Product interface is registered in HashMap by the register
method.
** 2. ** You are using the createClone ()
method inside the create
method.
-** Surround class **
Surround.java
import framework.*;
public class Surround implements Product {
private char srchar;
public Surround(char srchar) {
this.srchar = srchar;
}
// 1.Implementation of display method
@Override
public void display(String s) {
int length = s.getBytes().length;
for (int i = 0; i < length + 4; i++) {
System.out.print(srchar);
}
System.out.println("");
System.out.println(srchar + " " + s + " " + srchar);
for (int i = 0; i < length + 4; i++) {
System.out.print(srchar);
}
System.out.println("\n");
}
// 2.Implementation of createClone method
@Override
public Product createClone() {
Product p = null;
try {
p = (Product) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
The Surround
class is a class for implementing copy methods.
The points are the following two points.
** 1. ** Implements the display
method that encloses and displays the character string received when calling the display
method with the characters received by the constructor.
** 2. ** Implementing the createClone
method.
I will give a supplementary explanation about 2. The points are ** 2 **.
The first is the ** point enclosed in the ** try-catch statement.
The clone
method must implement the java.lang.Cloneable
interface as described in the Product interface.
If it is not implemented, an exception of CloneNotSupportedException
will occur, so it is enclosed in a try-catch statement in consideration of the case where an exception occurs.
The second is that the clone
method is called within the ** createClone
method **.
You can only call the clone
method from your own class (or subclass).
Therefore, in order to call the clone
method from the Client
class, it is necessary to make the call via another method such as the createClone
method.
-** Underline class **
Underline.java
import framework.*;
public class Underline implements Product {
private char ulchar;
public Underline(char ulchar) {
this.ulchar = ulchar;
}
// 1.Implementation of display method
@Override
public void display(String s) {
int length = s.getBytes().length;
System.out.println("\"" + s + "\"");
System.out.print(" ");
for (int i = 0; i < length; i++) {
System.out.print(ulchar);
}
System.out.println("\n");
}
// 2.Implementation of createClone method
@Override
public Product createClone() {
Product p = null;
try {
p = (Product) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return p;
}
}
The ʻUnderlineclass is a class for implementing copy methods like the
Surroundclass. The points are the following two points. ** 1. ** The character received in the constructor implements the
display method, which is displayed as an underline under the character string received when the
displaymethod is called. ** 2. ** Implementing the
createClone` method.
The supplementary explanation is the same as the Surround
class, so I will omit it.
-** Main class **
Main.java
import framework.*;
public class Main {
public static void main(String[] args) {
//Preparation
Client manager = new Client();
Underline ul1 = new Underline('-');
Underline ul2 = new Underline('~');
Surround sr1 = new Surround('#');
Surround sr2 = new Surround('@');
manager.register("underLine text1", ul1);
manager.register("underLine text2", ul2);
manager.register("surround text1", sr1);
manager.register("surround text2", sr2);
//Generate
Product p1 = manager.create("underLine text1");
p1.display("Hello, world.");
Product p2 = manager.create("underLine text2");
p2.display("Hello, world.");
Product p3 = manager.create("surround text1");
p3.display("Hello, world.");
Product p4 = manager.create("surround text2");
p4.display("Hello, world.");
}
}
In preparation, the register
method is used to register the Underline
and Surround
instances.
In the creation, we call the create
method to make a copy of the instance and call the display
method.
The result of executing Main.java
is as follows.
You can see that each given character is underlined or enclosed.
Execution result
"Hello, world."
-------------
"Hello, world."
~~~~~~~~~~~~~
#################
# Hello, world. #
#################
@@@@@@@@@@@@@@@@@
@ Hello, world. @
@@@@@@@@@@@@@@@@@
** * Addition: 2018/11/8 ** I asked links_2_3_4 how to add a double-byte space at the end. Thank you very much.
There are the following three points. ** 1. ** When there are multiple instances of similar classes, it is not necessary to separate the classes and it is easy to manage. ** 2. ** When it is difficult to create an instance from a class, you can easily create an instance. ** 3. ** You can separate the framework from the instance you want to create.
You learned about the Prototype pattern of copying other classes and creating new instances using the prototype instance. The sample code is uploaded below, so please refer to it if you like.
In addition, other design patterns are summarized below, so please refer to them as well.
-[Updated from time to time] Summary of design patterns in Java
-[Introduction to Design Patterns Learned in the Augmented and Revised Java Language](https://www.amazon.co.jp/ Introduction to Design Patterns Learned in the Augmented and Revised Java Language-Hiroshi Yuki / dp / 4797327030 / ref = pd_lpo_sbs_14_t_0? _Encoding = UTF8 & psc = 1 & refRID = 2ZE4GPYNN55JGDR5QMHP)
Recommended Posts