zoukankan      html  css  js  c++  java
  • 设计模式之简单工厂模式

    什么时候需要

    • 根据参数不同创建同一父类下不同子类
    • 将对象的创建与对象的使用分离,比如service负责使用dao,而不应该负责创建dao;否则,同一个dao的创建会出现在很多service,一旦需要修改,不仅违背开闭原则,而且改动面很大

    模式结构

    • 抽象产品角色:Product
    • 具体产品角色:ConcreteProduct
    • 工厂角色:Factory

    模式实现

    interface Product {
    	void otherMethods();
    }
    
    class ConcreteProductA implements Product {
    
    	public static final String NAME = "ConcreteProductA";
    
    	@Override
    	public void otherMethods() {
    		// do something
    	}
    
    }
    
    class ConcreteProductB implements Product {
    
    	public static final String NAME = "ConcreteProductB";
    
    	@Override
    	public void otherMethods() {
    		// do something
    	}
    
    }
    
    class Factory {
    	public static Product getProduct(String productName) {
    		if (ConcreteProductA.NAME.equals(productName)) {
    			return new ConcreteProductA();
    		} else if (ConcreteProductB.NAME.equals(productName)) {
    			return new ConcreteProductB();
    		} else {
    			throw new IllegalArgumentException("Not supported product name:" + productName);
    		}
    	}
    }
    
    • 工厂的方法是静态的,因此也叫静态工厂方法模式
    • 不属于GoF23设计模式
    • Simple Factory Pattern:定义一个工厂类,它可以根据参数的不同返回不同的实例,被创建的实例通常都具有共同的父类
    • 用于创建的对象创建方式固定,改动小,比如只会通过new ConcreteProductA()创建
    • 如果ConcreteProductA的创建有反射、new、不同构造器重载、cglib等多种形式,并且可能需要切换不同创建方式,那么建议使用工厂方法模式

    优点

    • 创建使用分离
    • 客户端无需关系具体实现类,只需要具体实现的参数,如只需要知道传入参数ConcreteProductA,得到的是Product对象,而不用知道ConcreteProductA类
    • 可以通过不同参数切换得到的不同Product实现

    缺点

    • 工厂类集中所有产品创建,职责过重,如一个工厂有几十个不同的工厂方法,用于创建几十个不同产品
    • 增加类的个数
    • 违背开闭原则,新增产品需要修改工厂类
    • 使用静态工厂方法,工厂角色无法形成基于继承的等级结构
  • 相关阅读:
    NET打包時加入卸载功能
    c#水晶报表注册码
    sqlserver:某年份某月份 是否在某时间段内的函数
    修改KindEditor编辑器 版本3.5.1
    Flash大文件上传(带进度条)
    让.Net程序脱离.net framework框架运行的方法(转载)
    夏天到了,什么时候园子的T恤可以出来?
    VS2005项目的安装与布署
    解决Select覆盖Div的简单直接的方法
    .Net向Page和UpdatePanel输出JS
  • 原文地址:https://www.cnblogs.com/zby9527/p/13287319.html
Copyright © 2011-2022 走看看