fuzzdelay:
より多くのデザインパターンを学習に取り組んで - 特にここで私は、Abstract Factoryパターンに取り組んでいます。私はすべて1行で「領収書1ヘッダ1フッター1」を出力しようとしているが、私は一度にのdisplayNameメソッド1を介して出力するように見えることができます。それらを連結するための最良の方法は何ですか?抽象クラスのtoStringメソッド?任意のポインタをいただければ幸いです。ここに私のクラスは次のとおりです。
public abstract class AbstractSalesReceiptFactory {
public abstract AbstractReceipt createReceipt();
public abstract AbstractHeader createHeader();
public abstract AbstractFooter createFooter();
}
public abstract class AbstractReceipt {
public abstract void displayName(AbstractReceipt a);
}
public abstract class AbstractHeader {
public abstract void displayName(AbstractHeader a);
}
public abstract class AbstractFooter {
public abstract void displayName(AbstractFooter a);
}
public class ConcreteReceipt1 extends AbstractSalesReceiptFactory{
public AbstractReceipt createReceipt() {
return new Receipt1();
}
public AbstractHeader createHeader() {
return new Header1();
}
public AbstractFooter createFooter() {
return new Footer1();
}
private ConcreteReceipt1() {}
public String displayName() {
return "Receipt1";
}
private static ConcreteReceipt1 instance = null;
public static ConcreteReceipt1 getInstance() {
instance = new ConcreteReceipt1();
return instance;
}
}
public class ConcreteReceipt2 extends AbstractSalesReceiptFactory{
public AbstractReceipt createReceipt() {
return new Receipt1();
}
public AbstractHeader createHeader() {
return new Header1();
}
public AbstractFooter createFooter() {
return new Footer1();
}
private ConcreteReceipt2() {
}
public String displayName() {
return "Receipt2";
}
private static ConcreteReceipt2 instance = null;
public static ConcreteReceipt2 getInstance() {
instance = new ConcreteReceipt2();
return instance;
}
}
public class Footer1 extends AbstractFooter{
public void displayName(AbstractFooter a) {
System.out.println("Footer 1");
}
}
public class Footer2 extends AbstractFooter{
public void displayName(AbstractFooter a) {
System.out.println("Footer 2");
}
}
public class Header1 extends AbstractHeader{
public void displayName(AbstractHeader a) {
System.out.println("Header 1");
}
}
public class Header2 extends AbstractHeader{
public void displayName(AbstractHeader a) {
System.out.println("Header 2");
}
}
public class Receipt1 extends AbstractReceipt{
public void displayName(AbstractReceipt a) {
System.out.println("Receipt 1");
}
}
public class Receipt2 extends AbstractReceipt{
public void displayName(AbstractReceipt a) {
System.out.println("Receipt 2");
}
}
私のメインクラス:
public class Client {
private static AbstractReceipt ar;
private static AbstractHeader ah;
private static AbstractFooter af;
public Client(AbstractSalesReceiptFactory factory) {
ar = factory.createReceipt();
ah = factory.createHeader();
af = factory.createFooter();
}
public void run() {
ar.displayName(ar);
ah.displayName(ah);
af.displayName(af);
}
public static void main (String [] args) {
AbstractSalesReceiptFactory receipt1 = ConcreteReceipt1.getInstance();
Client c1 = new Client(receipt1);
c1.run();
}
}
フィリップWrage:
あなたができる絶対的な最も簡単な方法は変更するだろう
System.out.println
にSystem.out.print
、既存のにdisplayName
メソッドの実装。また、オーバーライドすることができます
toString
方法を、しかし、あなたは残しておきたいことがありtoString
、それがあると使用としてdisplayName
。あなたが最初の更新に署名のだろう望む出力を取得するもう一つの簡単な方法
displayName
、それは返すので、あなたの抽象クラスでString
はなく、void
(と引数をとりませんが)。例えば、
public abstract class AbstractReceipt {
public abstract String displayName();
}
そして、直接印刷するのではなく、所望の表示名を返すために、あなたの具体的なクラスのすべてで実装を更新します。
public class Receipt1 extends AbstractReceipt{
public String displayName() {
return "Receipt 1";
}
}
最後に、更新run
を実行する方法をSystem.out.println
。
public void run() {
System.out.println(
String.format( "%s %s %s", ar.displayName(), ah.displayName(), af.displayName() )
);
}
しかし、あなたの要求はより多くのJavaのI / Oに関連しているとパターンを設計していません。あなたは、単にあなたのパターンの実装のデッド簡単な検証を提供するために、コンソール出力を使用しています。