首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象工厂模式与印刷

抽象工厂模式与印刷
EN

Stack Overflow用户
提问于 2020-03-18 20:19:13
回答 1查看 59关注 0票数 0

学习更多的设计模式--特别是在这里,我正在研究抽象的工厂模式。我试图输出“接收1头1页脚1”全部在一行,但我似乎只能通过displayName方法一次输出。连接它们的最佳方法是什么?抽象类中的toString方法?任何指示都将不胜感激。以下是我的课程:

代码语言:javascript
复制
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");
    }

}

我的主修班:

代码语言:javascript
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-18 20:39:14

implementations.

  • You可以在现有的displayName方法中将System.out.println更改为System.out.print
  1. 可以重写toString方法,但是您可能希望保留toString,并使用displayName.
  2. Another简单的方法获得您希望的输出,首先在抽象类中更新displayName的签名,这样它就返回String而不是void (并且不带参数)。例如,

代码语言:javascript
复制
    public abstract class AbstractReceipt {
        public abstract String displayName();
    }

然后更新所有具体类中的实现,以返回所需的显示名称,而不是直接打印。

代码语言:javascript
复制
    public class Receipt1 extends AbstractReceipt{
        public String displayName() {
            return "Receipt 1";
        }
    }

最后,更新run方法以执行System.out.println

代码语言:javascript
复制
    public void run() {
        System.out.println(
            String.format( "%s %s %s", ar.displayName(), ah.displayName(),  af.displayName() )
        );
    }

但是,您的请求更多地与Java /O相关,而不是设计模式。您只需使用控制台输出来提供模式实现的简单验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60746942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档