• 简单工厂模式


    简单工厂模式(Simple Factory Pattern)又叫静态工厂方法模式(Static FactoryMethod Pattern)

    :由一个工厂类根据传入的参数动态决定应该创建哪一种产品(产品类)。

    UML图:

     工厂角色(Factory)-->SimpleFactory:创建所需要的产品对象,被客户端调用。

     抽象(abstract Product)-->Ball 产品角色:所有具体产品的父类,父类可以是接口也可以是抽象类,产品的公共接口。

     具体产品(Concrete Product)----> FootBall & BaketBall角色:简单工厂所创建的具体产品对象。

    实例:Ball简单工厂

    抽象(abstract Product)产品角色:public abstract class Ball

    package com.maggie.simplefactory;
    
    public  abstract  class Ball {
         private String color;
    
        public Ball(String color) {
             super ();
             this .color = color;
        }
    
        public Ball() {
             super ();
        }
    
        public String getColor() {
             return color;
        }
    
        public  void setColor(String color) {
             this .color = color;
        }
        
        public  abstract  void play();
        
    }

    具体产品(Concrete Product)角色:从public abstract class Balll继承,重写方法,也可添加自己的方法。

    FootBall

    package com.maggie.simplefactory;
    
    public  class FootBall extends Ball {
    
    
        @Override
        public  void play() {
            String player = "the ball's color is "+ this .getColor()+",I am FootBall" ;
            System.out.println(player);
        }
    
        public FootBall() {
             super ();
             // TODO Auto-generated constructor stub 
        }
    
        public FootBall(String color) {
             super (color);
             // TODO Auto-generated constructor stub 
        }
    
        
    }

    BasketBall

    package com.maggie.simplefactory;
    
    public  class BasketBall extends Ball {
        @Override
        public  void play() {
            String player = "the ball's color is "+ this .getColor()+",I am BasketBall" ;
            System.out.println(player);
        }
    
        public BasketBall() {
             super ();
             // TODO Auto-generated constructor stub 
        }
    
        public BasketBall(String color) {
             super (color);
             // TODO Auto-generated constructor stub 
        }
    
    
    
    }

     工厂角色(SimpleFactory):球生产厂类,静态方法,接收main传入的图形名称,找到相应的具体产品的class,实例化。

    这里使用反射实现

    package com.maggie.simplefactory;
    
    import java.lang.reflect.InvocationTargetException;
    
    public  class SimpleFactory {
         public  static Ball createBall(Class c) {
            Ball ball = null ;
    
            /*
             * ball = (Ball)Class.forName(c.getName()).newInstance(); 无参数构造函数的实例
             */
    
            try {
                 // 有参数构造函数的实例
                if (c.getName().contains("FootBall" )) {
                    ball = (Ball) c.getConstructor(String. class ).newInstance("white+black" );
                } else  if (c.getName().contains("BasketBall" )){
                    ball = (Ball) c.getConstructor(String. class ).newInstance("orange" );
                }
            } catch (InstantiationException e) {
                 // TODO Auto-generated catch block 
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                 // TODO Auto-generated catch block 
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                 // TODO Auto-generated catch block 
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                 // TODO Auto-generated catch block 
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                 // TODO Auto-generated catch block 
                e.printStackTrace();
            } catch (SecurityException e) {
                 // TODO Auto-generated catch block 
                e.printStackTrace();
            }
    
            return ball;
        }
    }

    客户端调用

    package com.maggie.simplefactory;
    
    
    public  class Client {
         public  static  void main(String[] args) {
            Ball ball = SimpleFactory.createBall(FootBall. class );
            ball.play();
            
            Ball ball2 = SimpleFactory.createBall(BasketBall. class );
            ball2.play();
        }
    }

    输出的结果:

    the ball's color is white+black,I am FootBall
    the ball's color is orange,I am BasketBall

    简单工厂模式使得客户端的代码变得简洁,不用去关心具体是怎么实现的

    但是工厂类里面包含了所有的逻辑,如果需要添加新的产品,则就需要改变工厂类的各种逻辑,这就是简单工厂不好的地方。

    因此简单工厂模式违背了开放-封闭原则的缺点

  • 相关阅读:
    对于java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误解决
    attempted to assign id from null one-to-one
    The class has no identifier property
    javax.servlet.ServletException: com.microsoft.jdbc.base.BaseDatabaseMetaData.supportsGetGeneratedKeys()Z
    final和static
    hibernate事务
    log4j:WARN Please initialize the log4j system properly.解决
    用最有效率的方法算出2乘以8等於几
    char型变量中能存贮一个中文汉字
    基本数据类型范围
  • 原文地址:https://www.cnblogs.com/maggiejyt/p/7561152.html
Copyright © 2020-2023  润新知