zoukankan      html  css  js  c++  java
  • 设计模式-工厂模式

    目录

    1 简单工厂方法

    2 工厂方法

    3 抽象工厂方法

    4 抽象工厂方法+简单工厂方法

    简单工厂方法

    简单工厂的工厂类使用静态方法,通过不同的入参实例化不同的对象并返回(这里利用反射机制进行实例化对象

    能够横向的添加产品,而不改动源码

    产品接口

    package simple;
    public interface Z {
        public void method1();
        public void method2();
    }

    A1产品

    package simple;
    public class A1 implements Z{
        @Override
        public void method1() {
            System.out.println("A--method1");
        }
        @Override
        public void method2() {
            System.out.println("A--method2");
        }
    }

    工厂类

    public class Factory {
        public static Z getFunctionInstence(String type) throws Exception{
            Z z =null;
            z = (Z) Class.forName(type).newInstance();
            return z;
        } 
    }

     测试类

    @Test
        public void testFactory() {
            try {
                Factory.getFunctionInstence("simple.A1").method2();
    Factory.getFunctionInstence("simple.B1").method2(); }
    catch (Exception e) { e.printStackTrace(); } }

    结果

    A--method2
    B--method2

    工厂方法

    工厂方法的工厂类实现了统一的控制接口,对于实例化不同的产品,只需要变换实现接口的工厂类即可

    产品类及接口略

    工厂接口

    package standard;
    public interface IFunctionFactory {
        public Z getInstence();
    }

    工厂A

    package standard;
    public class FactoryA implements IFunctionFactory{
        @Override
        public Z getInstence() {
            return new A1();
        }
    }

    工厂B

    package standard;
    public class FactoryB implements IFunctionFactory{
        @Override
        public Z getInstence() {
            return new B1();
        }
    }

    测试类

    @Test
        public void testFactory() {
            IFunctionFactory factory;
             factory= new FactoryA();
             factory.getInstence().method1();
             
             factory = new FactoryB(); //通过改变工厂接口的实现
             factory.getInstence().method1();
        }

    结果

    A--method1
    B--method1

    抽象工厂方法

    抽象工厂的管理模式与工厂模式类似,但由于工厂类中有多种方法,可以同时对不同组的产品进行管理

    工厂接口

    package abstractFactory;
    public interface IFunctionFactory {
        public X getInstence1();
        public Y getInstence2();
    }

    工厂A

    package abstractFactory;
    public class FactoryA implements IFunctionFactory{
        @Override
        public X getInstence1() {
            return new A1();
        }
        @Override
        public Y getInstence2() {
            return new A2();
        }
    }

    工厂B

    package abstractFactory;
    public class FactoryB implements IFunctionFactory{
        @Override
        public X getInstence1() {
            return new B1();
        }
        public Y getInstence2() {
            return new B2();
        }
    }

    产品接口X,Y(略)

    package abstractFactory;
    public interface X {
        public void method1();
        public void method2();
    }

    继承产品接口X的产品A1,B1(略)

    package abstractFactory;
    public class A1 implements X{
        @Override
        public void method1() {
            System.out.println("A1--method1");
        }
        @Override
        public void method2() {
            System.out.println("A1--method2");
        }
    }

    继承产品接口Y的产品A2,B2(略)

    package abstractFactory;
    public class A2 implements Y{
        @Override
        public void method1() {
            System.out.println("A2--method1");
        }
        @Override
        public void method2() {
            System.out.println("A2--method2");
        }
    }

    测试类

    package abstractFactory;
    
    
    import org.junit.Before;
    import org.junit.Test;
    
    public class FunctionFactoryTest {
    
        @Before
        public void setUp() throws Exception {
        }
    
        @Test
        public void testFactoryA() {
            IFunctionFactory factory ;
            factory = new FactoryA();
            factory.getInstence1().method1();
            factory.getInstence2().method1();
            factory = new FactoryB();
            factory.getInstence1().method2();
            factory.getInstence2().method2();
        }
    
    }

    结果

    A1--method1
    A2--method1
    B1--method2
    B2--method2

     简单工厂方法改造抽象方法

     抽象工厂方法用于对产品组进行管理,但是修改的时候需要修改的类较多。

     通过简单工厂放方法对工厂类进行改造一定程度上可以实现开闭原则。

    工厂类

    package combination;
    public class Factory {
        String type="";
        Factory(String type){
            this.type=type;
        }
        public X getFactoryX() throws Exception{
            return (X) Class.forName(type+"1").newInstance();
        }
        
        public Y getFactoryY(String type) throws Exception{
            return (Y) Class.forName(type+"2").newInstance();
        }
    }

    测试类

    @Test
        public void test() throws Exception {
            Factory factory = new Factory("combination.B");
            factory.getFactoryX().method2();
        }

    结果

    B1--method2
  • 相关阅读:
    checkbox的问题整理
    通过阅读ASP.NET MVC5 框架解密 路由的一点心得
    用JS实现避免重复加载相同js文件
    如何给一个网站设置子网站
    Linux环境下Python的安装过程
    linux下更新Python版本并修改默认版本
    【引用】如何读技术类书籍
    专业收藏_资格证书
    ASP.NET单元测试配置文件
    面试收集
  • 原文地址:https://www.cnblogs.com/sunfan1988/p/3561500.html
Copyright © 2011-2022 走看看