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

    能够实现轻松方便地构造对象实例,而不必关心构造对象实例的细节和复杂过程呢

    工厂模式分为两类:工厂方法模式(包括简单工厂模式)与抽象工厂模式

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


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

    简单工厂模式

    // 产品类
    public interface IProduct {
        void show();
    }
    
    //产品实现类
    public class ProductA implements IProduct {
        @Override
        public void show() {
        }
    }
    
    //简单工厂类
    public class SimpleFactory {
    
        public IProduct createProduct(ProductType type) {
            switch (type) {
            case A:
                return new ProductA();
            }
            return null;
        }
    }
    
    //类型枚举
    public enum ProductType {
        A, B, C
    }

    缺点:

    每增加一种实现,都要修改createProduct方法,增加新的分支

    工厂方法模式

    // 工厂方法抽象
    public interface IFactory {
        IProduct createProduct();
    }
    
    // 具体工厂实现
    public class FactoryA implements IFactory {
        @Override
        public IProduct createProduct() {
            return new ProductA();
        }
    }

    缺点:

    如果实现很多,会产生很多工厂对象

    抽象工厂模式

    // 另一种产品
    public interface IComponent {
    
    }
    
    public class ComponentA implements IComponent {
    
    }
    
    
    // 抽象工厂
    public interface AbstractFactory {
        IComponent createComponent();  
        
        IProduct createProduct(); 
    }
    
    // 工厂实现
    public class FactoryA implements AbstractFactory {
        public IComponent createComponent() {
            return new ComponentA();
        }
    
        public IProduct createProduct() {
            return new ProductA();
        }
    }

    抽象工厂与工厂方法的区别:

    一个工厂可以生产多种产品,产品属于统一族群

    应用场景

    1. 不需要区考虑具体的初始化过程

    2. 易于产品扩展,新增实现不影响已有代码 

  • 相关阅读:
    Linux初始root密码设置
    ubuntu上的附件-终端和用快捷键ctrl+alt+f1 有啥区别
    分区工具PQ
    饮品DIY
    烘焙学习
    育儿所悟、所感、所想
    Linux netstat命令详解
    sharepoint环境安装
    python os模块
    java泛型
  • 原文地址:https://www.cnblogs.com/alex09/p/6670671.html
Copyright © 2011-2022 走看看