程序员

工厂模式及抽象工厂模式简介

2018-08-21  本文已影响19人  eb6684925911

本文介绍了工厂模式,抽象工厂模式并附有java代码实现demo。内容仅供参考使用,有不足之处请及时指出,也欢迎大家交流探讨。

工厂模式

工厂模式是创建型模式的一种,工厂模式是对产品的抽象。

场景

假设你下订单到厂家买灯泡,这时厂家会根据你的需求制作对应的灯泡。但是你并不关心灯泡是这么制作的,你只要拿到自己所需的灯泡就满足了。这种场景可以用工厂设计模式。

示例

创建一个灯接口,有发光方法。

public interface Lamp {

    void shine();
}

灯有对应的发光颜色,这里创建大中小三种型号的灯实例。

public class BigLamp implements Lamp{

    @Override
    public void shine() {
        System.out.println("我是一个大灯!");
    }
}
public class MiddleLamp implements Lamp {

    @Override
    public void shine() {
        System.out.println("我是一个中灯!");
    }
}
public class LittleLamp implements Lamp {

    @Override
    public void shine() {
        System.out.println("我是一个小灯!");
    }
}

创建一个灯工厂,用来根据需要生产灯实例。

public class LampFactory {

    public static Lamp makeLamp(String size) {

        if ("big".equals(size)) {
            return new BigLamp();
        }

        if ("middle".equals(size)) {
            return new MiddleLamp();
        }

        return new LittleLamp();
    }
}

下一个大灯订单,工厂会根据你的需要制作一个大灯。

Lamp lamp = LampFactory.makeLamp("big");
lamp.shine();

输出

我是一个大灯!

抽象工厂模式

抽象工厂模式是创建型模式的一种,抽象工厂模式是对产品族的抽象。

场景

你下了订单买了灯之后,发现缺少适合的灯座,这时,你需要下订单买一个与之匹配的灯座,灯与灯座之间是有关联关系的,大灯配大灯座,中灯配中灯座,小灯配小灯座,这里如果接的用工厂模式创建一个灯座工厂,会出现一个问题,那就是灯,和灯座是分别下订单买的,有可能买回来,发现并不匹配。这种场景就可以用抽象工厂模式来解决这个问题。

示例

灯接口及对应的大中小三种型号的灯实例。

public interface Lamp {

    void shine();
}
public class BigLamp implements Lamp{

    @Override
    public void shine() {
        System.out.println("我是一个大灯!");
    }
}
 public class MiddleLamp implements Lamp {

    @Override
    public void shine() {
        System.out.println("我是一个中灯!");
    }
}
public class LittleLamp implements Lamp {

    @Override
    public void shine() {
        System.out.println("我是一个小灯!");
    }
}

灯座接口及对应的大中小三种型号的灯座实例。

public interface LampHolder {
    
    void holdLamp();
}
public class BigLampHolder implements LampHolder {
    
    @Override
    public void holdLamp() {
        System.out.println("我是一个大灯座!");
    }
}
public class MiddleLampHolder implements LampHolder {

    @Override
    public void holdLamp() {
        System.out.println("我是一个中灯座!");
    }
}
public class LittleLampHolder implements LampHolder {

    @Override
    public void holdLamp() {
        System.out.println("我是一个小灯座!");
    }
}

创建抽象工厂接口,具有制作灯和灯座的方法。

public interface AbstractFactory {

    Lamp makeLamp();

    LampHolder makeLampHolder();
}

创建大中小三种型号的抽象工厂实例。

public class BigFactory implements AbstractFactory {

    @Override
    public Lamp makeLamp() {
        return new BigLamp();
    }

    @Override
    public LampHolder makeLampHolder() {
        return new BigLampHolder();
    }
}
public class MiddleFactory implements AbstractFactory {

    @Override
    public Lamp makeLamp() {
        return new MiddleLamp();
    }

    @Override
    public LampHolder makeLampHolder() {
        return new MiddleLampHolder();
    }
}
public class LittleFactory implements AbstractFactory {

    @Override
    public Lamp makeLamp() {
        return new LittleLamp();
    }

    @Override
    public LampHolder makeLampHolder() {
        return new LittleLampHolder();
    }
}

创建工厂生产者,用来创建对应型号的工厂。

public class FactoryProducer {

    public static AbstractFactory prodecerFactory(String size) {

        if ("big".equals(size)) {
            return new BigFactory();
        }

        if ("middle".equals(size)) {
            return new MiddleFactory();
        }

        return new LittleFactory();
    }
}

下一个大型号订单,工厂会根据你的需要制作相应的灯,灯座。

public class AbstractFactoryDemo {

    public static void main(String[] args) {

        AbstractFactory abstractFactory = FactoryProducer.prodecerFactory("big");

        Lamp lamp = abstractFactory.makeLamp();
        LampHolder lampHolder = abstractFactory.makeLampHolder();

        lamp.shine();
        lampHolder.holdLamp();
    }
}

输出

我是一个大灯!
我是一个大灯座!

区别

工厂模式是针对产品的抽象,抽象工厂模式是针对产品族的抽象。

对比 灯产品 灯座产品
大型号产品族 大灯 大灯座
中型号产品族 中灯 中灯座
小型号产品族 小灯 小灯座

大灯,中灯,小灯是同一产品等级的产品,大灯和大灯座是不同产品等级的产品,大灯和大灯座组成一个产品族,产品族由不同产品等级的产品根据某些关系组成。

上一篇 下一篇

猜你喜欢

热点阅读