java - 抽象工厂图案和印刷
问题描述
致力于学习更多的设计模式——特别是在这里我正在研究抽象工厂模式。我试图在一行中输出“Receipt 1 Header 1 Footer 1”,但我似乎只能通过 displayName 方法一次输出一个。连接它们的最佳方法是什么?抽象类中的 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();
}
}
解决方案
您可以做的最简单的事情是更改
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 相关,而不是设计模式。您只是使用控制台输出来为您的模式实现提供非常简单的验证。
推荐阅读
- windows - Linux到windows远程执行命令
- angular - $injector 没有提供者-在 AngularJs + Angular 8 混合应用程序单元测试用例中
- javascript - 如何从服务器作为对等点的 .getUserMedia()
- azure - 是否有任何可能的方法来更改现有 VSTS 扩展的发布者 ID?
- python-2.7 - pm2 因太多不稳定的重启而崩溃 (16)。停了下来。python中的“错误”
- python - Python/SQLite3 - 搜索功能不适用于结果的多种组合
- python - 为什么变量有时会在 Python 中绑定两个方向?
- html - 用 flex 拉伸图像
- ionic-framework - 离子原生推送注册格式变了?
- html - CSS相对百分比在Chrome中不起作用