Prototypeパターン
Constクラスも作ってみました。ソースコードに直で文字列が書いてあるのは気持ち悪いので。
% find . -name "*.java" -print0 |xargs -0 cat [] package common; public final class Const { public static class ProductKind { public static final String STRONG_MESSAGE = "strong message"; public static final String WARNING_BOX = "warning box"; public static final String SLASH_BOX = "slash box"; } } package framework; import java.util.HashMap; import java.util.Map; public class Manager { private Map<String, Product> showCase; public Manager() { showCase = new HashMap<String, Product>(); } public void register(String name, Product proto) { showCase.put(name, proto); } public Product create(String name) throws Exception { Product p = showCase.get(name); if (p == null) { throw new Exception("element not found exception"); } return p.createClone(); } } package framework; public abstract class Product implements Cloneable { public abstract void use(String s); public Product createClone() { Product p = null; try { p = (Product) clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return p; } } package main; import common.Const; import framework.Manager; import framework.Product; public class Main { public static void main(String[] args) throws Exception { Manager manager = new Manager(); UnderLinePen upen = new UnderLinePen('-'); MessageBox mbox = new MessageBox('*'); MessageBox sbox = new MessageBox('/'); manager.register(Const.ProductKind.STRONG_MESSAGE, upen); manager.register(Const.ProductKind.WARNING_BOX, mbox); manager.register(Const.ProductKind.SLASH_BOX, sbox); Product p1 = manager.create(Const.ProductKind.STRONG_MESSAGE); p1.use("Hello World!"); Product p2 = manager.create(Const.ProductKind.WARNING_BOX); p2.use("Hello World!"); Product p3 = manager.create(Const.ProductKind.SLASH_BOX); p3.use("Hello World"); } } package main; import framework.Product; public class MessageBox extends Product { private char decochar; public MessageBox(char ch) { this.decochar = ch; } @Override public void use(String s) { int length = s.getBytes().length; for (int i = 0; i < length + 4; i++) { System.out.print(decochar); } System.out.println(""); System.out.println(decochar + " " + s + " " + decochar); for (int i = 0; i < length + 4; i++) { System.out.print(decochar); } System.out.println(""); } } package main; import framework.Product; public class UnderLinePen extends Product { private char ulchar; public UnderLinePen(char ulchar) { this.ulchar = ulchar; } @Override public void use(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(""); } }
"Hello World!" ------------ **************** * Hello World! * **************** /////////////// / Hello World / ///////////////