Java 深入理解创建型设计模式之抽象工厂模式

网友投稿 228 2022-08-28


Java 深入理解创建型设计模式之抽象工厂模式

1.什么是抽象工厂模式?

抽象工厂模式: 定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。

抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。

从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。

将工厂抽象成两层,AbsFactory(抽象工厂))和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。

我们仍然以上一篇文章的案例为主,画出抽象工厂模式下的类图。

2.案例代码

首先仍然是Pizza种类相关的几个类。

package cohDqUHvjjm.szh.factory.abstractfactory.pizza;

/**

* 声明Pizza类为抽象类

*/

public abstract class Pizza {

//Pizza名称

protected String name;

//准备原材料,不同的披萨不一样。因此,我们做成抽象方法,具体的原材料实现交给它的子类去完成

public abstract void prepare();

//烘烤

public void bake() {

System.out.println(name + " baking;");

}

//切割

public void cut() {

System.out.println(name + " cutting;");

}

//打包

public void box() {

System.out.println(name + " boxing;");

}

public void setName(String name) {

this.name = name;

}

}

package com.szh.factory.abstractfactory.pizza;

public class LDPepperPizza extends Pizza {

@Override

public void prepare() {

setName("伦敦的胡椒pizza");

System.out.println("伦敦的胡椒pizza 准备原材料");

}

}

package com.szh.factory.abstractfactory.pizza;

public class LDCheesePizza extends Pizza {

@Override

public void prepare() {

setName("伦敦的奶酪pizza");

System.out.println("伦敦的奶酪pizza 准备原材料");

}

}

package com.szh.factory.abstractfactory.pizza;

public class BJPepperPizza extends Pizza {

@Override

public void prepare() {

setName("北京的胡椒pizza");

System.out.println("北京的胡椒pizza 准备原材料");

}

}

package com.szh.factory.abstractfactory.pizza;

public class BJCheesePizza extends Pizza {

@Override

public void prepare() {

setName("北京的奶酪pizza");

System.out.println("北京的奶酪pizza 准备原材料");

}

}

下面是抽象工厂和工厂方法的区别之处。

package com.szh.factory.abstractfactory.order;

import com.szh.factory.abstractfactory.pizza.Pizza;

//一个抽象工厂模式的抽象层(接口)

public interface AbsFactory {

//让下面的工厂子类来具体实现

public Pizza createPizza(String orderType);

}

package com.szh.abstractfactory.order;

import com.szh.abstractfactory.pizza.BJCheesePizza;

import com.szh.abstractfactory.pizza.BJPepperPizza;

import com.szh.abstractfactory.pizza.Pizza;

public class BJFactory implements AbsFactory {

@Override

public Pizza createPizza(String orderType) {

Pizza pizza = null;

if("cheese".equals(orderType)) {

pizza = new BJCheesePizza();

} else if ("pepper".equals(orderType)){

pizza = new BJPepperPizza();

}

return pizza;

}

}

package com.szh.abstractfactory.order;

import com.szh.abstractfactory.pizza.LDCheesePizza;

import com.szh.abstractfactory.pizza.LDPepperPizza;

import com.szh.abstractfactory.pizza.Pizza;

public class LDFactory implements AbsFactory {

@Override

public Pizza createPizza(String orderType) {

Pizza pizza = null;

if ("cheese".equals(orderType)) {

pizza = new LDCheesePizza();

} else if ("pepper".equals(orderType)) {

pizza = new LDPepperPizza();

}

return pizza;

}

}

package com.szh.factory.abstractfactory.order;

import com.szh.factory.abstractfactory.pizza.Pizza;

import java.util.Scanner;

public class OrderPizza {

AbsFactory absFactory;

public OrderPizza(AbsFactory absFactory) {

setFactory(absFactory);

}

private void setFactory(AbsFactory absFactory) {

Pizza pizza = null;

String orderType = ""; // 用户输入

this.absFactory = absFactory;

do {

orderType = getType();

// factory 可能是北京的工厂子类,也可能是伦敦的工厂子类

pizza = absFactory.createPizza(orderType);

if (pizza != null) { // 订购ok

pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

} else {

System.out.println("订购失败");

break;

}

} while (true);

}

// 写一个方法,可以获取客户希望订购的披萨种类

private String getType() {

Scanner scanner = new Scanner(System.in);

System.out.println("请输入 pizza 种类: ");

String str = scanner.nextLine();

return str;

}

}

最后是测试类。

package com.szh.abstractfactory;

import com.szh.abstractfactory.order.BJFactory;

import com.szh.abstractfactory.order.LDFactory;

import com.szh.abstractfactory.order.OrderPizza;

import java.util.Scanner;

public class MainTest {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

String content = scanner.next();

if ("Beijing".equals(content)) {

new OrderPizza(new BJFactory());

} else if ("London".equals(content)) {

new OrderPizza(new LDFactory());

} else {

System.out.println("无法预先匹配Pizza种类....");

scanner.close();

}

}

}

3.工厂方法 + 抽象工厂总结

工厂模式的意义:将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。

遵循了依赖倒转原则:创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)不要覆盖基类中已经实现的方法。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python 自定义函数(python下载安装教程)
下一篇:Python从门到精通(一):基础-03-Date和Zone(python date())
相关文章

 发表评论

暂时没有评论,来抢沙发吧~