这篇文章主要介绍了Java抽象工厂模式实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java抽象工厂模式实例分析文章都会有所收获,下面我们一起来看看吧。
抽象工厂模式: 定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
将工厂抽象成两层,AbsFactory(抽象工厂))和具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展。
我们仍然以上一篇文章的案例为主,画出抽象工厂模式下的类图。
首先仍然是Pizza种类相关的几个类。
package com.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();
}
}
}
关于“Java抽象工厂模式实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java抽象工厂模式实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。