• 设计模式-工厂模式


    目录

    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
  • 相关阅读:
    为用户添加角色
    WCF、MongoDB
    文件分布式存储实现例程
    Redis的Replication(复制)
    Lucene热词显示并选择
    Lucene热词统计
    通过队列解决Lucene文件并发创建索引
    Lucene.net应用
    Lucene.net
    Redis
  • 原文地址:https://www.cnblogs.com/sunfan1988/p/3561500.html
Copyright © 2020-2023  润新知