zoukankan      html  css  js  c++  java
  • 设计模式-抽象工厂

    抽象工厂

    定义:用一个超级工厂创建其他工厂,每个生成的工厂都能跟简单工厂一样创建对象。他与工厂方法不同的是:有一系列创建抽象产品的方法,而不是一个。

    使用场景:需要生产的产品多于一个产品类型,而系统只使用其中一种产品类型。

    1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。

    2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。

    代码示例:

    public abstract class AbstractFactory {
    
        public abstract Shape getShape(String shapeType);
    
        public abstract Color getColor(String colorType);
    }
    
    public interface Color {
    
        void fill();
    }
    
    public interface Shape {
    
        void draw();
    }
    
    public class ColorFactory extends AbstractFactory{
        @Override
        public Shape getShape(String shapeType) {
            return null;
        }
    
        @Override
        public Color getColor(String colorType) {
            if(colorType.equalsIgnoreCase("red")){
                return new Red();
            }
            return null;
        }
    }
    
    public class ShapeFactory extends AbstractFactory {
    
        @Override
        public Shape getShape(String shapeType) {
            if(shapeType==null){
                return null;
            }else if("CIRCLE".equalsIgnoreCase(shapeType)){
                return new Circle();
            }else if("SQUARE".equalsIgnoreCase(shapeType)){
                return new Square();
            }else if("RECTANGLE".equalsIgnoreCase(shapeType)){
                return new Rectangle();
            }
            return null;
        }
    
        @Override
        public Color getColor(String colorType) {
            return null;
        }
    }
    
    public class Red implements Color {
        @Override
        public void fill() {
            System.out.println("填充红色");
        }
    }
    
    public class Circle implements Shape {
        @Override
        public void draw() {
            System.out.println("我会画");
        }
    }
    
    public class FactoryProducer {
    
        public static AbstractFactory getFactory(String type){
            if(type.equalsIgnoreCase("shape")){
                return new ShapeFactory();
            }else if(type.equalsIgnoreCase("color")){
                return new ColorFactory();
            }
            return null;
        }
    }
    
    

    测试方法:

    public class ParteenDemo {
    
        public static void main(String[] args) {
            AbstractFactory colorFactory = FactoryProducer.getFactory("color");
            Color color = colorFactory.getColor("red");
            color.fill();
    
            AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
            Shape circle = shapeFactory.getShape("circle");
            circle.draw();
        }
    }
    
    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    BZOJ 1500 维修数列
    BZOJ 1501 智慧珠游戏
    BZOJ 1507 Editor
    BZOJ 3223 文艺平衡树
    BZOJ 3224 普通平衡树
    BZOJ 3196 二逼平衡树
    BZOJ 1048 分割矩阵
    BZOJ 1047 理想的正方形
    BZOJ 1046 上升序列
    BZOJ 1045 糖果传递
  • 原文地址:https://www.cnblogs.com/javammc/p/14938660.html
Copyright © 2011-2022 走看看