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

    何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

    如何解决:在一个产品族里面,定义多个产品。

    优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

    缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

    附上图,便于理解,图来自菜鸟教程

    抽象工厂模式的 UML 图

    形状接口
    //形状接口
    public interface Shape {
        void draw();
    }
    //矩形类
    class Rectangle implements Shape {
        @Override
        public void draw() {
            System.out.println("矩形");
        }
    }
    //正方形类
    class Square implements Shape {
        @Override
        public void draw() {
            System.out.println("正方形");
        }
    }
    //圆类
    class Circle implements Shape {
        @Override
        public void draw() {
            System.out.println("圆");
        }
    }
    //颜色接口
    interface Color {
        void fill();
    }
    //红色类
    class Red implements Color {
        @Override
        public void fill() {
            System.out.println("红色");
        }
    }
    //绿色类
    class Green implements Color {
        @Override
        public void fill() {
            System.out.println("绿色");
        }
    }
    //为Color和Shape对象创建抽象类来获取工厂。
    abstract class AbstractCreateFactory{
        public abstract Color getColor(String color);
        public abstract Shape getShape(String shape) ;
    }
    //得到形状和颜色的工厂类
    //得到形状和颜色的工厂类
    class CreateFactory extends AbstractCreateFactory{
    
        @Override
        public  Color getColor(String color) {
            if(color==null){
                return null;
            }
            if(color.equalsIgnoreCase("RED")){
                return new Red();
            } else if(color.equalsIgnoreCase("GREEN")){
                return new Green();
            }
            return null;
        }
    
        @Override
        public Shape getShape(String shapeType) {
            if(shapeType==null){
                return null;
            }
            if(shapeType.equalsIgnoreCase("CIRCLE")){
                return new Circle();
            } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
                return new Rectangle();
            } else if(shapeType.equalsIgnoreCase("SQUARE")){
                return new Square();
            }
            return null;
        }
    }
    //创建一个生成器
    class FactoryProducer{
        public static AbstractCreateFactory getFactory(){
            return new CreateFactory();
        }
    }
    //测试类
    class Test1{
        public static void main(String[] args) {
            Shape circle = FactoryProducer.getFactory().getShape("CIRCLE");
            circle.draw();
            Color red = FactoryProducer.getFactory().getColor("RED");
            red.fill();
        }
    }
  • 相关阅读:
    css的盒子模型由什么组成?
    div盒子水平、垂直居中
    display:none和visibility:hidden的区别
    创建一个多选框,且和文本关联起来(单击文本就像单击该选框一样)
    Canvas和SVG的不同
    js两个页面之间通过URL传参数
    css a标签去除下划线
    css 设置文本垂直居中
    css 边框圆角的方法
    html 文本框css设置边框圆角
  • 原文地址:https://www.cnblogs.com/xhlwjy/p/11323496.html
Copyright © 2011-2022 走看看