zoukankan      html  css  js  c++  java
  • java常用设计模式二:工厂模式

    1、简单工厂模式(静态工厂方法模式)

    抽象实例:

    public interface People {
        void talk();
    }

    具体实例:

    public class Doctor implements People {
        public void talk() {
            System.out.println("我是医生");
        }
    }
    public class Teacher implements People {
        public void talk() {
            System.out.println("我是教师");
        }
    }

    具体工厂

    public class Factory {
        public static People createInstance(String flag){
            if("doctor".equals(flag)){
                return new Doctor();
            }
            if("teacher".equals(flag)){
                return new Teacher();
            }
            return null;
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args){
            People people = Factory.createInstance("doctor");
            people.talk();
            people = Factory.createInstance("teacher");
            people.talk();
        }
    }
    我是医生
    我是教师

    该模式的缺点:增加 具体实例  需要修改工厂类

    2、工厂方法模式

    抽象实例:

    public interface People {
        void talk();
    }

    具体实例:

    public class Doctor implements People {
        public void talk() {
            System.out.println("我是医生");
        }
    }
    public class Teacher implements People {
        public void talk() {
            System.out.println("我是教师");
        }
    }

    抽象工厂

    public abstract class AbstractFactory {
        abstract People createInstance();
    }

    具体工厂

    public class DoctorFactory extends AbstractFactory {
        People createInstance() {
            return new Doctor();
        }
    }
    public class TeacherFactory extends AbstractFactory {
        People createInstance() {
            return new Teacher();
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args){
            AbstractFactory doctorFactory = new DoctorFactory();
            AbstractFactory teacherFactory = new TeacherFactory();
            doctorFactory.createInstance().talk();
            teacherFactory.createInstance().talk();
        }
    }
    我是医生
    我是教师

    该模式的相对于 简单工厂模式 来说,如果要增加新的 具体实例  不需要修改原来的工厂方法,只需要新增一个 具体工厂。缺点就是当 具体实例 很多的时候,会增加很多与之对应的 具体工厂

    3、抽象工厂模式

    抽象实例和具体实例和前面的一样,此处省略不写

    抽象工厂

    public interface AbstractFactory {
        People createDoctorInstance();
        People createTeacherInstance();
    }

    具体工厂

    public class ConcreteFactory  implements AbstractFactory {
    
        public People createDoctorInstance() {
            return new Doctor();
        }
    
        public People createTeacherInstance() {
            return new Teacher();
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args){
            AbstractFactory doctorFactory = new ConcreteFactory();
            doctorFactory.createDoctorInstance().talk();
            doctorFactory.createTeacherInstance().talk();
        }
    }
    我是医生
    我是教师

    该模式缺点和简单工厂模式一样:增加 具体实例 需要修改 工厂类。

    4、工厂模式与反射结合,实现新增 具体实例 不需要修改和新增 工厂类

    抽象实例和具体实例和前面的一样,此处省略不写

    具体工厂

    public class ReflectFactory {
        public People createInstance(String className) throws Exception {
            Class<?> cls = Class.forName(className);
            People people = (People) cls.newInstance();
            return people;
        }
    }

    测试类:

    public class Test {
        public static void main(String[] args) throws Exception {
            ReflectFactory reflectFactory = new ReflectFactory();
            reflectFactory.createInstance("factory.demo.Doctor").talk();
            reflectFactory.createInstance("factory.demo.Teacher").talk();
        }
    }
    我是医生
    我是教师
  • 相关阅读:
    Python学习32天(socket、tcp协议)
    Python学习第31天(异常、异常捕捉)
    Python之旅的第30天(过程记录,选课系统的基本实现)
    Python之旅的第29天(property补充、元类和自定义元类)
    Python之旅的第28天(描述符、类的装饰器)
    Python之旅的第27天(复习、习题实现、__enter__、__exit__)
    Python之旅第26天(__slots__等内置方法、软件开发规范)
    假期第二周
    假期第一周
    第十六周学习进度博客
  • 原文地址:https://www.cnblogs.com/boshen-hzb/p/10233443.html
Copyright © 2011-2022 走看看