欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java 23种设计模式之工厂方法模式

程序员文章站 2024-01-05 17:01:10
...

1. 概念

    定义一个用于创建对象的接口,让子类决定实例化哪个类。
    工厂方法使一个类的实例化延迟到其子类。

2. 创建父类接口

    public interface ILeiFeng {

        /**
         * 扫地
         */
         void sweep();

        /**
         * 洗衣服
         */
         void wash();

        /**
         * 买米
         */
         void buyRice();
    }

3. 创建产品类实现父类接口

    1.产品一:学生
    public class Student implements ILeiFeng {

        @Override
        public void sweep() {
            System.out.println("学生扫地");
        }

        @Override
        public void wash() {
            System.out.println("学生洗衣服");
        }

        @Override
        public void buyRice() {
            System.out.println("学生买米");
        }
    }


    2.产品二:志愿者
    public class Volunteer implements ILeiFeng{

        @Override
        public void sweep() {
            System.out.println("志愿者扫地");
        }

        @Override
        public void wash() {
            System.out.println("志愿者洗衣服");
        }

        @Override
        public void buyRice() {
            System.out.println("志愿者买米");
        }
    }

4. 创建工厂类父类接口

    public interface IFactory {

        /**
         * 创建雷锋对象
         * @return
         */

        ILeiFeng createLeiFeng();
    }

5. 创建工厂类子类实现工厂类父类接口

    1.学生工厂类实现
    public class StudentFactory implements IFactory {

        @Override
        public ILeiFeng createLeiFeng() {
            return new Student();
        }

    }

    2.志愿者工厂类实现
    public class VolunteerFactory implements IFactory {

        @Override
        public ILeiFeng createLeiFeng() {
            return new Volunteer();
        }

    }

6. 测试类

    public class Test {

        @org.junit.Test
        public void test(){
            //需要切换 只需要修改这个工厂类
            IFactory factory = new VolunteerFactory();
            ILeiFeng leiFeng = factory.createLeiFeng();
            leiFeng.sweep();
            leiFeng.wash();
            leiFeng.buyRice();
        }
    }

7.小结

    优:
    克服了简单工厂开放-封闭原则,保持了封装对象创建过程的优点,
    拥抱变化,符合迪米特法则,符合依赖倒置原则,符合里氏替换原则。     
    缺:
    需要Creator和相应的子类作为factory method的载体,如果应用模型
    确实需要creator和子类存在,则很好;否则的话,需要增加一个类层次。

上一篇:

下一篇: