【JavaSE】解释三种工厂设计模式-----简单工厂模式、工厂方法模式、抽象工厂模式。

一、简单工厂模式

简单工厂就是有一个工厂的接口,然后将实现接口子类的实例化操作放在另一个实现类中
然后这个类通过接受的参数来决定实现什么类,参数由客户端传入

interface INoodles{   //抽象产品
    public void desc();
}

class LzNoodles implements INoodles{  // 具体产品

    @Override
    public void desc() {
        System.out.println("兰州拉面");
    }
}

class PaoNoodles implements INoodles{  //具体产品

    @Override
    public void desc() {
        System.out.println("泡面");
    }
}

class GanNoodles implements INoodles{  //具体产品

    @Override
    public void desc() {
        System.out.println("干拌面");
    }
}

class CreateNoodles{    //具体工厂
    public INoodles create(int count){
        switch (count){
            case 1:return new LzNoodles();
            case 2:return new PaoNoodles();
            case 3:return new GanNoodles();
        }
        return new LzNoodles();
    }
}

public class Test {   //客户端
    public static void main(String[] args) {
        INoodles noodles = new CreateNoodles().create(2);
        noodles.desc();
    }
}

简单工厂的缺点就是:使用了switch-case,这样的话想要再添加一种产品,就得修改具体工厂类中的代码,违背了开-闭原则。

二、工厂方法模式

工厂方法模式基本解决了简单工厂的开-闭原则问题,当我们想要加入新产品的时候,不需要改变具体工厂类中具体的代码。
只需要添加一个子类,它需要实现抽象工厂的接口,然后在客户端中的代码稍微修改,就可以产生新产品了。

interface INoodles {         //抽象产品
    public void desc();
}

class LzNoodles implements INoodles{   //具体产品

    @Override
    public void desc() {
        System.out.println("兰州拉面");
    }
}

class PaoNoodles implements INoodles{   //具体产品

    @Override
    public void desc() {
        System.out.println("泡面");
    }
}

class GanNoodles implements INoodles{   //具体产品

    @Override
    public void desc() {
        System.out.println("干拌面");
    }
}

interface CreateNoodles{    //抽象工厂
    public INoodles createNoodles();
}

class CreateLz implements CreateNoodles{    //具体工厂

    @Override
    public INoodles createNoodles() {
        return new LzNoodles();
    }
}

class CreatePao implements CreateNoodles{  //具体工厂

    @Override
    public INoodles createNoodles() {
        return new PaoNoodles();
    }
}

class CreateGan implements CreateNoodles{  //具体工厂

    @Override
    public INoodles createNoodles() {
        return new GanNoodles();
    }
}

public class Test {   //客户端
    public static void main(String[] args) {
        CreateNoodles createNoodles = new CreateLz();
        INoodles noodles = createNoodles.createNoodles();
        noodles.desc();
    }
}

工厂方法模式完美的运用了java的面向对象和多态特性。比如:现在要新加一种面,龙须面,就得创建一个龙须面具体产品类,然后创建一个龙须面的具体工厂类。在客户端中选择CreateLong(龙须面),就可以得到新产品了。不需要修改其他的代码。

三、抽象工厂模式

维基百科:抽象工厂模式是对一组具有相同主题的工厂进行封装。

  • 抽象工厂模式就是一个工厂不可能只有一种产品,会有多种产品。
  • 这些产品之间有着不同的产品等级。比如:第五代CPU和第七代CPU就是同一个产品等级(这样相同的产品等级的产品就用工厂方法去生成)
  • 而CPU和内存就不是一个产品等级,但是它俩却是一个产品族,因为它俩都是生成电脑所需要的。
  • 所以它们需要一个抽象工厂,这个工厂生产这些产品族最后组装起来的各种品牌产品。比如:战神电脑和联想电脑。
  • 工厂方法模式解决的范畴是产品等级(AMD处理器,Intel处理器等);抽象工厂模式解决的范畴是产品族等级(联想PC、惠普PC等);
interface CPU{  //抽象产品
    void desc();
}

interface MEM{   //抽象产品
    void desc();
}

class HaseeCPU implements CPU {   //具体产品

    @Override
    public void desc() {
        System.out.println("战神CPU");
    }
}

class HaseeMEM implements MEM{  //具体产品

    @Override
    public void desc() {
        System.out.println("战神内存");
    }
}

class LenovoCPU implements CPU{  //具体产品

    @Override
    public void desc() {
        System.out.println("联想CPU");
    }
}

class LenovoMEM implements MEM {   //具体产品

    @Override
    public void desc() {
        System.out.println("联想内存");
    }
}

interface PCFactory{   //抽象工厂
    public CPU createCPU();
    public MEM createMEM();
}

class HaseeFactory implements PCFactory{   //具体工厂


    @Override
    public CPU createCPU() {
        return new HaseeCPU();
    }

    @Override
    public MEM createMEM() {
        return new HaseeMEM();
    }
}

class LenovoFactory implements PCFactory{ //具体工厂


    @Override
    public CPU createCPU() {
        return new LenovoCPU();
    }

    @Override
    public MEM createMEM() {
        return new LenovoMEM();
    }
}

public class Test {   //客户端
    public static void main(String[] args) {
        PCFactory pcFactory = new HaseeFactory();
        CPU cpu = pcFactory.createCPU();
        MEM mem = pcFactory.createMEM();
        cpu.desc();
        mem.desc();
    }
}
  • 下面用一张图理解一下代码:
    在这里插入图片描述

四、总结

  • 简单工厂模式:可以实现由用户决定生产某一种商品,但是它内部的代码是switch-case,要添加一个新产品,就得改代码,违背了开闭原则。
  • 工厂方法模式:通过将生产商品的过程延续到子类去实现,添加一个新产品,只需要添加一个子类就行了,但是不能解决多种不同产品等级的问题。
  • 抽象工厂模式:多种不同产品等级,就是一堆相同产品族的不同等级产品要生产一种商品,可以将不同产品等级的方法抽象起来,综合在一个抽象工厂中。抽象工厂,接收各个产品接口创建的产品,然后通过具体工厂组装成最终的商品。
  • PS:我感觉工厂方法多创建一个抽象产品和具体产品,然后就把它写进抽象工厂中,用具体工厂实现游一下。这样就把工厂方法模式提升为抽象工厂模式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值