美文网首页
工厂模式(创建型)

工厂模式(创建型)

作者: 游牧族人 | 来源:发表于2018-09-02 09:40 被阅读11次
    • 简单工厂模式
      三个角色: 抽象产品类,具体产品类,简单工厂类
    /** 抽象产品类 */
    public abstract class AbstractProduct
    {
        public abstract void func();
    }
    -------------------------------------------------------------------------------------
    /** 具体产品类 */
    public class ProductA extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product A");
        }
    }
    /** 具体产品类 */
    public class ProductB extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product B");
        }
    }
    /** 具体产品类 */
    public class ProductC extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product C");
        }
    }
    -------------------------------------------------------------------------------------
    /** 简单工厂类 */
    public class SimpleFactory
    {
        public static AbstractProduct createProduct(String product){
            switch (product){
                case "A":return new ProductA();
                case "B":return new ProductB();
                case "C":return new ProductC();
                default:return null;
            }
        }
    }
    
    /** 主测试函数 */
    public class Main
    {
        public static void main(String[] args)
        {
            AbstractProduct product = SimpleFactory.createProduct("A");
            product.func();
        }
    }
    Output:   "product A"
    

    简单工厂模式写法简单,但是拓展性差,若是想再添加一种产品则需要修改工厂方法内部代码。

    • 多方法工厂模式
      是简单工厂模式的变种。由于简单工厂模式依据传递的参数判断产品的类型,因此容易造成参数不正确而无法产生合适的产品。这时可以将产品的创建分发到不同的函数中,只要调用合适的方法即可创建合适的产品。
    /** 抽象产品类 */
    public abstract class AbstractProduct
    {
        public abstract void func();
    }
    -------------------------------------------------------------------------------------
    /** 具体产品类 */
    public class ProductA extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product A");
        }
    }
    /** 具体产品类 */
    public class ProductB extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product B");
        }
    }
    /** 具体产品类 */
    public class ProductC extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product C");
        }
    }
    -------------------------------------------------------------------------------------
    /** 简单工厂类 */
    public class SimpleFactory
    {
        public static AbstractProduct createProductA(){
            return new ProductA();
        }
        public static AbstractProduct createProductB(){
            return new ProductB();
        }
        public static AbstractProduct createProductC(){
            return new ProductC();
        }
    }
    
    /** 主测试函数 */
    public class Main
    {
        public static void main(String[] args)
        {
            AbstractProduct productA = SimpleFactory.createProductA();
            productA.func();
            AbstractProduct productB = SimpleFactory.createProductB();
            productB.func();
            AbstractProduct productC = SimpleFactory.createProductC();
            productC.func();
        }
    }
    Output:  "porductA  \n  productB  \n  productC"
    
    • 工厂方法模式
      四个角色:抽象产品,具体产品,抽象工厂,具体工厂。
    /** 抽象产品类 */
    public abstract class AbstractProduct
    {
        public abstract void func();
    }
    -------------------------------------------------------------------------------------
    /** 具体产品类 */
    public class ProductA extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product A");
        }
    }
    /** 具体产品类 */
    public class ProductB extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product B");
        }
    }
    /** 具体产品类 */
    public class ProductC extends AbstractProduct
    {
        @Override
        public void func()
        {
            System.out.println("product C");
        }
    }
    
    /** 抽象工厂类 */
    public abstract class AbstractFactory
    {
        public abstract AbstractProduct createProduct();
    }
    -------------------------------------------------------------------------------------
    /** 具体工厂类 */
    public class FactoryA extends AbstractFactory
    {
        @Override
        public AbstractProduct createProduct()
        {
            return new ProductA();
        }
    }
    /** 具体工厂类 */
    public class FactoryB extends AbstractFactory
    {
        @Override
        public AbstractProduct createProduct()
        {
            return new ProductB();
        }
    }
    /** 具体工厂类 */
    public class FactoryC extends AbstractFactory
    {
        @Override
        public AbstractProduct createProduct()
        {
            return new ProductC();
        }
    }
    
    /** 主测试函数 */
    public class main
    {
        public static void main(String[] args)
        {
            AbstractFactory factoryA = new FactoryA();
            AbstractProduct productA = factoryA.createProduct();
            productA.func();
    
            AbstractFactory factoryB = new FactoryB();
            AbstractProduct productB = factoryB.createProduct();
            productB.func();
        }
    }
    Output:  "productA  \n  productB"
    

    工厂方法模式写起来要比简单工厂模式复杂,但是他将简单工厂解耦,产品不需要在一个工厂中被建造,从而在我们增加一项产品时,只需要增加对应的产品工厂和产品即可。

    • 抽象工厂模式
      四个角色:抽象产品,具体产品,抽象工厂,具体工厂。
      与工厂方法模式的区别:
      抽象工厂模式的抽象产品可以是多个,而工厂方法模式的抽象产品只能是同一个(只有一个产品簇)。
    /** 抽象产品类 */
    public abstract class AbstractProductA
    {
        public abstract void func();
    }
    /** 具体产品类 */
    public class ProductAA extends AbstractProductA
    {
        @Override
        public void func()
        {
            System.out.println("product AA");
        }
    }
    /** 具体产品类 */
    public class ProductAB extends AbstractProductA
    {
        @Override
        public void func()
        {
            System.out.println("product AB");
        }
    }
    -------------------------------------------------------------------------------------
    /** 抽象产品类 */
    public abstract class AbstractProductB
    {
        public abstract void func();
    }
    /** 具体产品类 */
    public class ProductBA extends AbstractProductA
    {
        @Override
        public void func()
        {
            System.out.println("product BA");
        }
    }
    /** 具体产品类 */
    public class ProductBB extends AbstractProductA
    {
        @Override
        public void func()
        {
            System.out.println("product BB");
        }
    }
    
    /** 抽象工厂类 */
    public abstract class AbstractFactory
    {
        public abstract AbstractProductA createProductAA();
        public abstract AbstractProductA createProductAB();
        public abstract AbstractProductB createProductBA();
        public abstract AbstractProductB createProductBB();
    }
    /** 具体工厂类 */
    public class Factory extends AbstractFactory
    {
        @Override
        public AbstractProductA createProductAA()
        {
            return new ProductAA();
        }
    
        @Override
        public AbstractProductA createProductAB()
        {
            return new ProductAB();
        }
    
        @Override
        public AbstractProductB createProductBA()
        {
            return new ProductBA();
        }
    
        @Override
        public AbstractProductB createProductBB()
        {
            return new ProductBB();
        }
    }
    

    抽象工厂模式主要用于多个产品簇对象的创建过程。

    相关文章

      网友评论

          本文标题:工厂模式(创建型)

          本文链接:https://www.haomeiwen.com/subject/zpipwftx.html