抽象工厂模式(创建型)
定义:一个接口用于创建相关或有依赖关系的对象簇,而无需指明具体的类。
抽象工厂模式是将工厂抽象成两层,工厂类的抽象和工厂产品类的抽象。可以根据创建对象类型使用对应的工厂子类,可以将单个简单工厂类变成工厂簇,有利于代码维护和拓展。
目录结构:
类图:
产品基类(Snacks )
public abstract class Snacks {
//商店名称
private String name;
//准备原材料
public abstract void prepare();
//打包盒
public abstract void box();
public void machining(){
System.out.println(name + "加工生产;");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
百草味核桃仁实体类(BaiCaoFlavoWalnutKernel )
public class BaiCaoFlavoWalnutKernel extends Snacks {
@Override
public void prepare() {
System.out.println("百草味核桃仁准备原材料");
}
@Override
public void box() {
System.out.println("百草味核桃仁打包");
}
}
百草味碧根果实体类(BaiCaoFlavoPecan )
public class BaiCaoFlavoPecan extends Snacks {
@Override
public void prepare() {
System.out.println("百草味碧根果准备原材料");
}
@Override
public void box() {
System.out.println("百草味碧根果打包");
}
}
三只松鼠核桃仁实体类(ThreeSquirrelsWalnutKernel )
public class ThreeSquirrelsWalnutKernel extends Snacks {
@Override
public void prepare() {
System.out.println("三只松鼠核桃仁准备原材料");
}
@Override
public void box() {
System.out.println("三只松鼠核桃仁打包");
}
}
三只松鼠碧根果实体类(ThreeSquirrelsPecan )
public class ThreeSquirrelsPecan extends Snacks {
@Override
public void prepare() {
System.out.println("三只松鼠碧根果准备原材料");
}
@Override
public void box() {
System.out.println("三只松鼠碧根果打包");
}
}
商店工厂接口(Store )
(这里可以用接口,也可以用抽象类)
public interface Store {
Snacks createdProduct(String product);
}
百草味工厂(BaiCaoFlavo )
public class BaiCaoFlavo implements Store{
public Snacks createdProduct(String product) {
Snacks snacks = null;
switch (product) {
case "核桃仁":
snacks = new BaiCaoFlavoWalnutKernel();
snacks.setName("百草味核桃仁的");
break;
case "碧根果":
snacks = new BaiCaoFlavoPecan();
snacks.setName("百草味碧根果的");
break;
default:
System.out.println("无此产品");
return null;
}
snacks.prepare();
snacks.machining();
snacks.box();
return snacks;
}
}
三只松鼠工厂(ThreeSquirrels )
public class ThreeSquirrels implements Store{
public Snacks createdProduct(String product) {
Snacks snacks = null;
switch (product) {
case "核桃仁":
snacks = new ThreeSquirrelsWalnutKernel();
snacks.setName("三只松鼠核桃仁的");
break;
case "碧根果":
snacks = new ThreeSquirrelsPecan();
snacks.setName("三只松鼠碧根果的");
break;
default:
System.out.println("无此产品");
return null;
}
snacks.prepare();
snacks.machining();
snacks.box();
return snacks;
}
}
订单类(OrderSnacks )
由订单类创建工厂,再由工厂创建产品。
public class OrderSnacks {
public OrderSnacks(String store, String product) {
Store factory;
switch (store) {
case "百草味":
factory = new BaiCaoFlavo();
break;
case "三只松鼠":
factory = new ThreeSquirrels();
break;
default:
System.out.println("无此产品");
return;
}
factory.createdProduct(product);
}
}
客户端(Client )
public class Client {
public static void main(String[] args) {
new OrderSnacks("百草味", "核桃仁");
}
}
结果:
总结:简单工厂就是工厂方法模式的特例。就是只有一个工厂,而工厂方法模式是有多个工厂。创建实例都是在工厂中创建。而抽象工厂模式是工厂方法的升级版,将工厂类又抽象了一层,就是两层抽象。工厂的创建交给订单类,而产品的创建还是交给工厂。