设计模式(2)工厂模式

这次主要是讲一些关于设计模式里面抽象工厂部分的内容,首先,先摆上一个实例来说

接下来是相应的代码部分:

首先是相应的实体类部分,

零食基类:

package com.sise.工厂模式.抽象工程模式;

public abstract class Snack {
    public String name;
    public double price;

    public Snack(){
    }

    public Snack(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Snack{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}


吃的零食类:

package com.sise.工厂模式.抽象工程模式;

//吃的零食
public class EatSnack extends Snack{
    public EatSnack(){
        super();
    }

    public String toString(){
        return super.toString();
    }
} 

喝的零食类:

package com.sise.工厂模式.抽象工程模式;

//喝的零食
public class DrinkSnack extends Snack{
    public DrinkSnack(){
        super();
    }

    public String toString(){
        return super.toString();
    }
}

辣条类:

package com.sise.工厂模式.抽象工程模式;

public class SpicyStrip extends Snack {
    public SpicyStrip(){
        super();
    }

    public String toString(){
        return super.toString();
    }
}

工厂接口:

package com.sise.工厂模式.抽象工程模式;

public interface SnackFactory {
    public Snack createSnack();
}

 

 

零食工厂

package com.sise.工厂模式.抽象工程模式;

public class EatSnackFactory implements SnackFactory {
    @Override
    public EatSnack createSnack() {
        EatSnack es=new EatSnack();
        es.setName("薯片");
        es.setPrice(66.5);
        return es;
    }
}

 

饮料工厂

package com.sise.工厂模式.抽象工程模式;

public class DrinkSnackFactory implements SnackFactory {
    @Override
    public DrinkSnack createSnack() {
        DrinkSnack ds=new DrinkSnack();
        ds.setName("可乐");
        ds.setPrice(166);
        return ds;
    }
}

 

辣条工厂

package com.sise.工厂模式.抽象工程模式;

public class SpicyStripFactory implements SnackFactory {
    @Override
    public Snack createSnack() {
            SpicyStrip spicyStrip=new SpicyStrip();
            spicyStrip.setName("辣条");
            spicyStrip.setPrice(2.5);
            return spicyStrip;
    }
}

 

最后关于测试部分的代码如下所示:

package com.sise.工厂模式.抽象工程模式;

public class test {
    public static void main(String[] args) {
        SnackFactory eatSnackFactory=new EatSnackFactory();
        SnackFactory drinkFactory=new DrinkSnackFactory();
        EatSnack es= (EatSnack) eatSnackFactory.createSnack();
        System.out.println(es.toString());
        DrinkSnack ds= (DrinkSnack) drinkFactory.createSnack();
        System.out.println(ds.toString());
    }
}

一个基本的抽象工厂模式的demo就搭建好了。

不得不说,设计模式里面,最常用的模式之一就是工厂模式了,虽然很多时候我们都知道工厂模式是一个方便于开发者用来进行相应的对象生产的一种设计模式,但是我们对于其内容进行深入研究之后会发现工厂模式里面具有一定的优缺点。

优点:对于抽象工厂模式来说最大的一个优点应该就是封装性了,对于外键调用来说,我们大可不必要去知道该如何产生相应的内容,因为工厂内部都已经帮我们封装好了,我们只需要调用即可。

缺点:对于纵向的扩展是比较困难的,但是对于横向的扩展是比较适合的。例如说,我有一个零食工厂,专门用于生产吃的零食和喝的零食两个类型。对于这种情况而言,我们开设了两个工厂,一个是DrinkSnackFactory,另外一个是EatSnackFactory,均实现了SnackFactory工厂。假如说后边要添加业务,我们需要增设一个新的业务,例如说添加卖油盐类产品,则需要再设计一个抽象工厂,然后分别设计其接口的实现类。这样就会非常地复杂。(这一种情况,我称呼之为纵向扩展)。但是假若说我们后期的业务只是需要添加一个生产辣条类的工厂时,可以新设一个SpicystripFactory实现一个SnackFactory接口即可了。


猜你喜欢

转载自blog.csdn.net/danny_idea/article/details/80058433