zoukankan      html  css  js  c++  java
  • JAVA设计模式——简单工厂

    工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。我看有的书上和有的文章里是分为两种,没有简单工厂。

    工厂模式主要的作用是:一个对象在实例化的时候可以选择多个类,在实例化的时候根据一些业务规则来选择实例化哪个类。

    1.先定义一个图形接口,有一个画方法

    public interface Shape {
        void draw();
    }

    2.再创建两个实现接口的实体类

    public class Rectangle implements Shape {
    
        @Override
        public void draw() {
            System.out.println("画长方形。");
        }
    }
    public class Square implements Shape {
    
        @Override
        public void draw() {
            System.out.println("画正方形。");
        }
    }

    3.创建一个工厂,生成基于给定信息的实体类的对象

    public class ShapeFactory {
    
        //使用 createShape 方法获取形状类型的对象
        public Shape createShape(String shapeType) {
            if (shapeType == null) {
                return null;
            }
            if (shapeType.equalsIgnoreCase("RECTANGLE")) {
                return new Rectangle();
            } else if (shapeType.equalsIgnoreCase("SQUARE")) {
                return new Square();
            }
            return null;
        }
    }

    4.使用该工厂,通过传递类型信息来获取实体类的对象。

    public class SimpleFactoryPatternDemo {
    
        public static void main(String[] args) {
            ShapeFactory shapeFactory = new ShapeFactory();
    
            //获取 Rectangle 的对象,并调用它的 draw 方法
            Shape shape1 = shapeFactory.createShape("RECTANGLE");
    
            //调用 Rectangle 的 draw 方法
            shape1.draw();
    
            //获取 Square 的对象,并调用它的 draw 方法
            Shape shape2 = shapeFactory.createShape("SQUARE");
    
            //调用 Square 的 draw 方法
            shape2.draw();
        }
    }

    输出:

    画长方形。
    画正方形。

    这里Shape接口声明的变量既可以用Rectangle实例化,也可以用Square实例化。ShapeFactory就是一个工厂,去决定怎么实例化。

    这个模式的缺点是对“开-闭”原则的支持不够。如果要新加一个“产品”,比如新加一个实现Shape的圆形类,要在工厂里使用这个圆形类的话,需要去修改ShapeFactory工厂的代码。

    那么应该怎么解决这个缺点,下篇工厂方式模式就是解决这个问题。

  • 相关阅读:
    .Net下的MSMQ(微软消息队列)的同步异步调用
    [收藏]JS获取网页中HTML元素的几种方法分析
    在FireFox下设为首页的解决方法
    如何创建和使用Web Service代理类
    [收藏]61条面向对象设计的经验原则
    [总结]DotNet中用到的加密算法总结
    如何把用SQL语句int型整数转换成二进制数
    彻底杜绝PHP的session,cookie,Cannot modify header错误
    MSN总是报80048820的错误,网上搜的一些资料解决不了,我找到了真正解决办法!
    [收藏]MD5加密的javascript实现
  • 原文地址:https://www.cnblogs.com/shanejim/p/9982176.html
Copyright © 2011-2022 走看看