美文网首页
简单工厂模式

简单工厂模式

作者: 明朗__ | 来源:发表于2017-02-21 15:28 被阅读33次

    1.简单工厂模式(这里只是简单举例 代码不规范处还需谅解)

    原则: 提供创建对象的功能,不需要关心具体的实现

    //创建一个汽车的抽象类
    public abstract class Car {
    
        protected String name;
    
        protected final static String CARSTYLE = "汽车";
    
        public abstract String drive();
    
        public String getName() {
            return this.name;
        }
    }
    
    //子类实现父类
    public class BackCar extends Car {
        @Override
        public String drive() {
            return name+Car.CARSTYLE;
        }
    }
    
    //创建一个工厂类负责具体的对象的创建
    public class CarFactory {
        public static Car newCar(String color){
            Car car=null;
            switch (color){
                case "黑色":
                    car=new BackCar();
                    break;
                case "红色":
                    car=new RedCar();
                    break;
                case "蓝色":
                    car=new BuleCar();
                    break;
            }
            return car;
        }
    }
    
    //在客户的调用(根据传入的参数类型不同 而构建不同的对象)
     Car car = CarFactory.newCar(RED);
     tv_text.setText(car.drive());
    

    由上可以看出 对对象的具体实现实现的隐藏

    弊端:
    1.不符合开闭原则 如果有新的对象生成 需要改写工厂类
    2.不符合单一原则 工厂类是根据类型来判断创建哪种汽车的

    二. 升级简单工厂方法

    //创建一个注解类
    @Target(ElementType.TYPE)//用于描述类、接口(包括注解类型) 或enum声明
    @Retention(RetentionPolicy.RUNTIME)//即运行时保留
    @Documented //用于描述其它类型的annotation应该被作为被标注的程序成员的公共API
    @Inherited //修饰的annotation类型被用于一个class 则这个Annotation将被用于该class的子类。
    public @interface CarColor {
        String color() default "";
    }
    
    //使用注解
    @CarColor(color="BACK")
    public class BackCar extends Car {
        @Override
        public String drive() {
            return name+Car.CARSTYLE;
        }
    }
    
    //创建工厂方法 根据对象类型来构建对应的对象
    public class CarFactory2 {
    
        public static <T extends Car> T newCar(Class<T> c) {
            Car car = null;
            String identifier = null;
            try {
                Class componentClass = Class.forName(c.getName());
                if (componentClass.isAnnotationPresent(CarColor.class)) {//制定类型的注释存在该元素之上
                    CarColor component = (CarColor) componentClass.getAnnotation(CarColor.class);
                    identifier = component.color();
                    System.out.println(String.format("颜色:' %s '", identifier));
                } else {
                    System.out.println("com.jasongj.UpperCaseComponent is not annotated by"
                            + " com.jasongj.annotation.Component");
                }
            } catch (ClassNotFoundException ex) {
                ex.printStackTrace();
            }
    
            try {
                car = (Car) Class.forName(c.getName()).newInstance();
                car.name = identifier;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return (T) car;
        }
    }
    
    //客户顿调用(传入对应的对象类型来构建对应的对象 其中应用到了反射和注解)
     car= CarFactory2.newCar(BuleCar.class);
     tv_text.setText(car.drive());
    

    相关文章

      网友评论

          本文标题:简单工厂模式

          本文链接:https://www.haomeiwen.com/subject/kzpxwttx.html