Java设计模式-抽象工厂模式

抽象工厂模式(创建型)

定义:一个接口用于创建相关或有依赖关系的对象簇,而无需指明具体的类。

抽象工厂模式是将工厂抽象成两层,工厂类的抽象和工厂产品类的抽象。可以根据创建对象类型使用对应的工厂子类,可以将单个简单工厂类变成工厂簇,有利于代码维护和拓展。

目录结构:

类图:

产品基类(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("百草味", "核桃仁");
    }
}

结果:

总结:简单工厂就是工厂方法模式的特例。就是只有一个工厂,而工厂方法模式是有多个工厂。创建实例都是在工厂中创建。而抽象工厂模式是工厂方法的升级版,将工厂类又抽象了一层,就是两层抽象。工厂的创建交给订单类,而产品的创建还是交给工厂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值