您当前的位置: 首页 > 

梁云亮

暂无认证

  • 4浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

简单工厂设计模式

梁云亮 发布时间:2019-10-15 08:40:28 ,浏览量:4

简单工厂模式

简单工厂模式(Simple Factory)能够根据提供给它的数据,返回一个类的实例。

使用简单工厂模式可以在不需要了解类详细信息的情况下实例化对象。在子类比较固定不需要扩展时,可以使用简单工厂。

特点:每增加一个类,都需要修改工厂类的代码,在其中添加相应的case。

  • 优点: 简单工厂实现了对象的创建和使用分离的功能 客户端无需知道所要创建的具体产品类的类名,只需要具体产品类对应的参数就可以创建出产品对象 在不修改任何客户端代码的情况下更换或增加新的具体产品类,在一定程度上提高了系统的灵活性
  • 缺点: 工厂类的职责过重,工厂类中包含具体的逻辑判断语句,它一旦有问题,整个系统都会出问题 在添加新的类的时候,工厂类就要修改,这违反了开闭原则,不利于系统的扩展和维护 工厂类的静态方法,使得工厂角色无法形成基于继承的等级结构
示例:

在这里插入图片描述

基本实现
  • 产品接口
public interface Traffic {
    void run();
    void brake();
}
  • 产品类
public class Audi implements Traffic {
    @Override
    public void run() {
        System.out.println("audi run");
    }
    @Override
    public void brake() {
        System.out.println("audi brake");
    }
}
public class Benz implements Traffic {
    @Override
    public void run() {
        System.out.println("benz run");
    }
    @Override
    public void brake() {
        System.out.println("benz brake");
    }
}
public class BMW implements Traffic {
    @Override
    public void run() {
        System.out.println("bmw run");
    }

    @Override
    public void brake() {
        System.out.println("bmw brake");
    }
}
  • 工厂类:
public class TrafficFactory {
    public static Traffic create(String type) { //type指的是用记要生产的车型的名称
        type = type.toLowerCase();//转换为小写
        switch (type) {
            case "audi":
                return new Audi();
            case "benz":
                return new Benz();
            case "bmw":
                return new BMW();
            default:
                return null;
        }
    }
}
  • 测试方法:
public static void main(String[] args) {
    String type= "Audi";
    Traffic traffic = TrafficFactory.create(type);
    traffic.run();
    traffic.brake();
}
改进一
  • 其它代码不变,修改工厂类代码如下:
public class TrafficFactory {
    public static Traffic create(String type){ //类名
        Traffic res = null;
        String className = "com.hc.product."+type; // 假设所有的产品类全部放在com.hc.product包中
        try {
            res = (Traffic) Class.forName(className).getDeclaredConstructor().newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return  res;
    }
}
  • 测试代码
public static void main(String[] args) {
    String type= null;
   // type= "Audi";
    type="Benz";
    Traffic traffic = TrafficFactory.create(type);
    traffic.run();
    traffic.brake();
}
改进二
  • 其它代码不变,修改工厂类代码如下:
public class TrafficFactoryPlus {
    private TrafficFactoryPlus(){
    }
    public static Traffic create(Class clazz)  {
        Object traffic = null;
        try {
            traffic = clazz.getDeclaredConstructor().newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        if(!(traffic instanceof  Traffic)){
            throw  new RuntimeException("类型不正确");
        }
        return (Traffic) traffic;
    }

    public static void main(String[] args) {
       Object s = "8";
        boolean b =  s instanceof  String;
        System.out.println(b);
        System.out.println("end");
    }
}

  • 测试代码
public static void main(String[] args) {
    Traffic traffic = null;
    traffic = TrafficFactoryPlus.create(String.class);
    traffic.run();
    traffic.brake();
}
关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.1658s