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

    1、引言

    工厂模式可以分为类: 
    1)简单工厂模式(Simple Factory) 
    2)工厂方法模式(Factory Method) 
    3)抽象工厂模式(Abstract Factory) 
     这种模式从上到下逐步抽象,并且更具一般性,且通常将简单工厂模式看为工厂方法模式的一种特例,两者归为一类。 

    2、区别 

    工厂方法模式:
    一个抽象产品类,可以派生出多个具体产品类。   
    一个抽象工厂类,可以派生出多个具体工厂类。   
    每个具体工厂类只能创建一个具体产品类的实例。

    抽象工厂模式:
    多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
    一个抽象工厂类,可以派生出多个具体工厂类。   
    每个具体工厂类可以创建多个具体产品类的实例。   

    总结:
    工厂方法模式只一个抽象产品类,而抽象工厂模式有多个。   
    工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

    3、示例

    1)简单工厂模式

    产品类:

    public class BMW {
        public BMW() {
        }
    }
    
    public class BMWX1 extends BMW {
        public BMWX1() {
            System.out.println("this is BMW X1");
        }
    }
    
    public class BMWX7 extends BMW {
        public BMWX7() {
            System.out.println("this is BMW X7");
        }
    }
    

    工厂类:

    public class BMWFactory {
        public BMW creatBMW(String type){
            if (type.equals("X1")) {
                return new BMWX1();
            } else if (type.equals("X7")) {
                return new BMWX7();
            } else {
                return null;
            }
        }
    }
    

    客户类:

    public class Customer {
        public static void main(String[] args) {
            BMWFactory factory = new BMWFactory();
            BMW X1 = factory.creatBMW("X1");
            BMW X7 = factory.creatBMW("X7");
        }
    }
    

    每增加一种车型,需增加一个if-else条件语句,违反了对扩展开放,对修改关闭原则

    2)工厂方法模式:

    产品类:

    public class BMW {
        public BMW() {
        }
    }
    
    public class BMWX1 extends BMW {
        public BMWX1() {
            System.out.println("BMW X1");
        }
    }
    
    public class BMWX7 extends BMW {
        public BMWX7() {
            System.out.println("BMW X7");
        }
    }
    

    工厂类:

    public interface BMWFactory {
        BMW createBMW();
    }
    
    public class BMWX1Factory implements BMWFactory {
        @Override
        public BMW createBMW() {
            return new BMWX1();
        }
    }
    
    public class BMWX7Factory implements BMWFactory {
        @Override
        public BMW createBMW() {
            return new BMWX7();
        }
    }
    

    客户类:

    public class Customer {
        public static void main(String[] args) {
            BMWX1Factory x1 = new BMWX1Factory();
            x1.createBMW();
    
            BMWX7Factory x7 = new BMWX7Factory();
            x7.createBMW();
        }
    }
    

    客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象。

     3)抽象工厂模式:

    产品类:

    public interface Engine {
    }
    
    public class EngineA implements Engine {
        public EngineA() {
            System.out.println("Engine A");
        }
    }
    
    public class EngineB implements Engine {
        public EngineB() {
            System.out.println("Engine B");
        }
    }
    
    public interface AirCondition {
    }
    
    public class AirConditionC implements AirCondition {
        public AirConditionC() {
            System.out.println("AirCondition C");
        }
    }
    
    public class AirConditionD implements AirCondition {
        public AirConditionD() {
            System.out.println("AirCondition D");
        }
    }
    

    工厂类:

    public interface Abstractfactory {
        public Engine selectEngine();
        public AirCondition selectAirCondition();
    }
    
    public class FactoryBMWX1 implements Abstractfactory {
        @Override
        public Engine selectEngine() {
            return new EngineA();
        }
    
        @Override
        public AirCondition selectAirCondition() {
            return new AirConditionC();
        }
    }
    
    public class FactoryBMWX7 implements Abstractfactory{
        @Override
        public Engine selectEngine() {
            return new EngineB();
        }
    
        @Override
        public AirCondition selectAirCondition() {
            return new AirConditionD();
        }
    }
    

    客户类:

    public class Customer {
        public static void main(String[] args) {
            FactoryBMWX1 x1 = new FactoryBMWX1();
            x1.selectEngine();
            x1.selectAirCondition();
    
            FactoryBMWX7 x7 = new FactoryBMWX7();
            x7.selectEngine();
            x7.selectAirCondition();
        }
    }
    

    提供多个工厂角色分别对应多个产品角色,每一个具体工厂角色只负责某一个产品角色的实例化,每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

     4、总结

      无论是哪种工厂模式,在形式和特点上也是极为相似的,最终目的都是为了解耦。在使用时,不必在意具体属于哪种模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。

    转自:http://blog.csdn.net/jason0539

  • 相关阅读:
    leetcode 1036. 逃离大迷宫(bfs)
    leetcode 1040. 移动石子直到连续 II(滑动窗口)
    leetcode 1039. 多边形三角剖分的最低得分(区间dp)
    Han Xin and His Troops(扩展中国剩余定理 Python版)
    CCPC 2019 网络赛 HDU huntian oy (杜教筛)
    多项式模板
    树链剖分(模板) 洛谷P3384
    2019牛客暑期多校训练营(第九场)
    CF #575 Div3
    计算几何模板集
  • 原文地址:https://www.cnblogs.com/hunterCecil/p/5564016.html
Copyright © 2011-2022 走看看