美文网首页っ碎片化代码
A04—抽象工厂模式

A04—抽象工厂模式

作者: 白晓明 | 来源:发表于2019-04-23 04:00 被阅读2次

意图:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
主要解决: 接口选择问题。
何时使用: 在有多个业务品种、业务分类时。
如何解决: 在一个业务品种或业务分类里面,定义多个业务。
关键代码: 在一个工厂里聚合多个同类产品。
优点: 封装性;产品族内的约束为非公开状态。
缺点: 扩展困难。
应用实例: 一个耳机工厂生产不同颜色不同形状的耳机。

1.为耳机颜色创建一个接口。
public interface EarphoneColor {
    //耳机颜色
    void color();
}
2.实现接口实体类
public class Red implements EarphoneColor{

    @Override
    public void color() {
        System.out.println("耳机为红色");
    }

}

public class Black implements EarphoneColor{

    @Override
    public void color() {
        System.out.println("耳机为黑色!");
    }

}
3. 创建耳机形状接口
public interface EarphoneShape {

    //耳机形状
    void shape();
}

4. 实现接口实体类
public class PlugIn implements EarphoneShape{

    @Override
    public void shape() {
        System.out.println("插入式耳机");
    }
}

public class HeadMounted implements EarphoneShape{

    @Override
    public void shape() {
        System.out.println("头戴式耳机");
    }

}
5. 为颜色和形状创建抽象类来获取工厂
public abstract class DeviceFactory {
    public abstract EarphoneColor getColor(String color);
    
    public abstract EarphoneShape getShape(String shape);
}
6. 生成实体类的对象。
public class ColorFactory extends DeviceFactory{

    @Override
    public EarphoneColor getColor(String color) {
        if(color == null)
            return null;
        if(color.equalsIgnoreCase("red")) 
            return new Red();
        else if(color.equalsIgnoreCase("black"))
            return new Black();
        return null;
    }

    @Override
    public EarphoneShape getShape(String shape) {
        return null;
    }

}

public class ShapeFactory extends DeviceFactory{

    @Override
    public EarphoneColor getColor(String color) {
        return null;
    }

    @Override
    public EarphoneShape getShape(String shape) {
        if(shape == null)
            return null;
        if(shape.equalsIgnoreCase("plug-in")) 
            return new PlugIn();
        else if(shape.equalsIgnoreCase("head-mounted"))
            return new HeadMounted();
        return null;
    }

}
7.创建一个工厂生成器类,通过传递参数来获取工厂。
public class FactoryProducer {

    public static DeviceFactory getFactory(String factoryName) {
        if(factoryName.equalsIgnoreCase("shape")) 
            return new ShapeFactory();
        else if(factoryName.equalsIgnoreCase("color"))
            return new ColorFactory();
        return null;
    }
}
8.实例
public class Custom {

    public static void main(String[] args) {
        //获取耳机形状工厂
        DeviceFactory df = FactoryProducer.getFactory("shape");
        //获取形状为头戴式
        EarphoneShape es = df.getShape("head-mounted");
        es.shape();
    }
}

参考:
设计模式简介

相关文章

网友评论

    本文标题:A04—抽象工厂模式

    本文链接:https://www.haomeiwen.com/subject/wmhugqtx.html