Best way to implement the Factory Pattern in Java

后端 未结 8 1080
别那么骄傲
别那么骄傲 2020-12-09 13:59

I am trying to write a Factory Pattern to create either a MainMode or a TestMode in my program. The code I was previously using to create these objects was:

         


        
8条回答
  •  萌比男神i
    2020-12-09 14:28

    What you realy want to do, is make a factory, which returns you an object of abstract class or interface (theyr implementors of course). In the factory method you then deside, which implementor to choose. You if you choose an abstract class, you can implement some common logic in it and let other methods unimplemented (declaring them abstract). You would let the concrete descenders implement them depending on theyr need. This is factory design pattern:

    public class GridManagerFactory {
        public static AbstractGridManager getGridManager(LifecicleAlgorithmIntrface lifecicleAlgorithm, String... args){
            AbstractGridManager manager = null;
    
            // input from the command line
            if(args.length == 2){
                CommandLineGridManager clManager = new CommandLineGridManager();
                clManager.setWidth(Integer.parseInt(args[0]));
                clManager.setHeight(Integer.parseInt(args[1]));
                // possibly more configuration logic
                ...
                manager = clManager;
            } 
            // input from the file
            else if(args.length == 1){
                FileInputGridManager fiManager = new FileInputGridManager();
                fiManager.setFilePath(args[0]);
                // possibly more method calls from abstract class
                ...
                manager = fiManager ;
            }
            //... more possible concrete implementors
            else{
                manager = new CommandLineGridManager();
            }
            manager.setLifecicleAlgorithm(lifecicleAlgorithm);
            return manager;
        }
    }
    

    The commoun logic in the abstract class is available to its descenders:

    public abstract class AbstractGridManager {
        private LifecicleAlgorithmIntrface lifecicleAlgorithm;
        // ... more private fields
    
        //Method implemented in concrete Manager implementors 
        abstract public Grid initGrid();
    
        //Methods common to all implementors
        public Grid calculateNextLifecicle(Grid grid){
            return this.getLifecicleAlgorithm().calculateNextLifecicle(grid);
        }
    
        public LifecicleAlgorithmIntrface getLifecicleAlgorithm() {
            return lifecicleAlgorithm;
        }
        public void setLifecicleAlgorithm(LifecicleAlgorithmIntrface lifecicleAlgorithm) {
            this.lifecicleAlgorithm = lifecicleAlgorithm;
        }
        // ... more common logic and geter-seter pairs
    }
    

    The concrete implementor only need implement the method which is declared abstract:

      public class FileInputGridManager extends AbstractGridManager {
    
            private String filePath;
    
            @Override
            public Grid initGrid() {
                return this.initGrid(this.getFilePath());
            }
    
            public Grid initGrid(String filePath) {
                List cells = new ArrayList<>();
                char[] chars;
                File file = new File(filePath); // for ex foo.txt
                // ... more logic
                return grid;
            }
        }
    

    The receiver of AbstractGridManager would call the methods on him and get the logic, implemented in the concrete descenders (and partually in the abstract class methods) without knowing what is the concrete implementation he got. This is also know like inversion of control or dependency injection

提交回复
热议问题