我被迫写这篇文章有两个原因。 最近,我遇到了“抽象工厂”模式。 俗话说:“自己不知道怎么做,教一个朋友。” 众所周知,巩固材料的最好方法之一就是向先前研究过的人解释。 第二个原因-在研究这种模式的过程中,我没有遇到任何对我个人而言清楚地阐明“抽象工厂”本质的材料(至少在Habré上如此)。
因此,让我们开始吧。 您需要通过研究这种模式来回答自己的第一个问题:“什么是抽象工厂”。 最简单,最准确的答案是抽象工厂是“工厂工厂”。 但是这里出现了第二个问题:“为什么有人甚至需要一个“工厂工厂”? 为了回答这个问题,请考虑一个现实生活中的例子。
假设您决定完全控制汽车市场。 怎么做? 您可以创建自己的汽车品牌,生产产品,开展大型广告公司等。 但是,在这种情况下,您必须与丰田或福特等汽车市场巨头竞争。 从这场斗争中获得胜利并不是事实。 更好的解决方案是购买所有这些公司的工厂,继续以自己的品牌生产汽车,然后将利润放到您的口袋里。 如果我没记错的话,那么经济中的这种结构就叫做控股。 该控股公司将是抽象工厂或“工厂工厂”。 在我们的程序中,抽象工厂(持有)将由接口或抽象类表示。 控股中包含的企业由实现此接口的类表示。
public interface CarsFactory { } public class ToyotaFactory implements CarsFactory {} public class FordFactory implements CarsFactory {}
接下来,您召集工厂的管理人员说:“从现在开始,我们将在工厂生产具有两种车身类型的汽车-轿车和轿跑车。 例如,日本人将做ToyotaSedan和ToyotaCoupe,美国人将做FordSedan和FordCoupe。” 为了使工厂不会忘记确切需要做的事情并且不启动SUV等,我们会在显眼的地方(在特定工厂中,工程师会弄清楚轿车和轿跑车的总图)(在特定工厂中,工程师会弄清楚如何制造所需的汽车)。 因此,我们的CarsFactory界面中出现2种方法:
public interface CarsFactory { Sedan createSedan(); Coupe createCoupe(); }
因此,在CarsFactory接口的子类中,还必须实现这些方法。
public class ToyotaFactory implements CarsFactory { @Override public Sedan createSedan() { return new ToyotaSedan(); } @Override public Coupe createCoupe() { return new ToyotaCoupe(); } } public class FordFactory implements CarsFactory { @Override public Sedan createSedan() { return new FordSedan(); } @Override public Coupe createCoupe() { return new FordCoupe(); } }
请注意,方法中返回值的类型将与返回值完全相同,即轿车和双门轿跑车。 回到我们的比喻-您告诉工厂制造一辆轿车-您得到了一辆轿车。 诸如福特轿车之类的功能对您而言并不重要。
从上面的代码可以很容易地猜出,某些实体应该出现在我们的程序中,它们描述了特定的车身类型-轿车和双门轿跑车。 这些实体将是接口。
public interface Sedan {} public interface Coupe {}
当然,这些附图应具有在特定工厂中制造的汽车形式的特定实施例。
public class ToyotaCoupe implements Coupe { public ToyotaCoupe() { System.out.println("Create ToyotaCoupe"); } } public class ToyotaSedan implements Sedan { public ToyotaSedan() { System.out.println("Create ToyotaSedan"); } } public class FordCoupe implements Coupe { public FordCoupe () { System.out.println("Create FordCoupe"); } } public class FordSedan implements Sedan { public FordSedan() { System.out.println("Create FordSedan"); } }
就是这样,我们能够生产任何品牌,任何类型的汽车的“工厂工厂”已经准备就绪。 将来,您可能会决定开始生产SUV会很不错。 您将需要创建另一个界面,并将SUV的图纸挂在公司办公室中(将所需的方法添加到CarsFactory并在子公司中实施)。 您也有可能决定占领另一个市场并购买所有日产工厂。 这意味着您需要创建另一个实现CarsFactory的类-NissanFactory,并开始以该品牌(NissanCoupe,NissanSedan等)生产汽车。
但是特定用户(购车者)将如何与我们的持股人互动? 买家通常不知道您已经占领了世界上所有的汽车制造厂。 他来到公司规模较小的办公室,说:“我需要汽车!” “太好了!” -我们告诉他,-“您已写信给地址! 一个工厂的工厂就是您所需要的!”
CarsFactory factory;
“您在一天中的这个时候更喜欢哪个汽车公司?”,我们问。 假设某个客户想要购买丰田。 没问题!
factory = new ToyotaFactory();
“你想要什么类型的身体?” 假设轿车。 “很棒的选择!”
factory.createSedan();
车准备好了,您可以走了!