有做网站运营的吗,自己做投票网站怎么弄,免费手机h5模板网站模板,开公司流程及费用2022最新工厂方法模式 简单工厂模式的不足模式动机模式定义模式结构模式分析模式实例与解析 简单工厂模式的不足
在简单工厂模式中#xff0c;只提供了一个工厂类#xff0c;该工厂类处于对产品类进行实例化的中心位置#xff0c;它知道每一个产品对象的创建细节#xff0c;并决定… 工厂方法模式 简单工厂模式的不足模式动机模式定义模式结构模式分析模式实例与解析 简单工厂模式的不足
在简单工厂模式中只提供了一个工厂类该工厂类处于对产品类进行实例化的中心位置它知道每一个产品对象的创建细节并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时必须修改工厂类加入必要的处理逻辑这违背了“开闭原则”。在简单工厂模式中所有的产品都是由同一个工厂创建工厂类职责较重业务逻辑较为复杂具体产品与工厂类之间的耦合度高严重影响了系统的灵活性和扩展性而工厂方法模式则可以很好地解决这一问题。
模式动机
考虑这样一个系统按钮工厂类可以返回一个具体的按钮实例如圆形按钮、矩形按钮、菱形按钮等。在这个系统中如果需要增加一种新类型的按钮如椭圆形按钮那么除了增加一个新的具体产品类之外还需要修改工厂类的代码这就使得整个设计在一定程度上违反了“开闭原则”。
现在对该系统进行修改不再设计一个按钮工厂类来统一负责所有产品的创建而是将具体按钮的创建过程交给专门的工厂子类去完成我们先定义一个抽象的按钮工厂类再定义具体的工厂类来生成圆形按钮、矩形按钮、菱形按钮等它们实现在抽象按钮工厂类中定义的方法。这种抽象化的结果使这种结构可以在不修改具体工厂类的情况下引进新的产品如果出现新的按钮类型只需要为这种新类型的按钮创建一个具体的工厂类就可以获得该新按钮的实例这一特点无疑使得工厂方法模式具有超越简单工厂模式的优越性更加符合“开闭原则”。
模式定义
工厂方法模式(Factory Method Pattern)又称为工厂模式也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式它属于类创建型模式。在工厂方法模式中工厂父类负责定义创建产品对象的公共接口而工厂子类则负责生成具体的产品对象这样做的目的是将产品类的实例化操作延迟到工厂子类中完成即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
模式结构 工厂方法模式包含如下角色
Product抽象产品ConcreteProduct具体产品Factory抽象工厂ConcreteFactory具体工厂
模式分析
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性工厂方法模式保持了简单工厂模式的优点而且克服了它的缺点。在工厂方法模式中核心的工厂类不再负责所有产品的创建而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口而不负责哪一个产品类被实例化这种细节这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
当系统扩展需要添加新的产品对象时仅仅需要添加一个具体产品对象以及一个具体工厂对象原有工厂对象不需要进行任何修改也不需要修改客户端很好地符合了“开闭原则”。而简单工厂模式在添加新产品对象后不得不修改工厂方法扩展性不好。工厂方法模式退化后可以演变成简单工厂模式。
模式实例与解析
实例一电视机工厂 将原有的工厂进行分割为每种品牌的电视机提供一个子工厂海尔工厂专门负责生产海尔电视机海信工厂专门负责生产海信电视机如果需要生产TCL电视机或创维电视机只需要对应增加一个新的TCL工厂或创维工厂即可原有的工厂无须做任何修改使得整个系统具有更加的灵活性和可扩展性。 ?xml version1.0?
configclassNameHaierTVFactory/className
/configpublic interface TV
{public void play();
}public class HaierTV implements TV
{public void play(){System.out.println(HaierTV......);}
}
public class HisenseTV implements TV
{public void play(){System.out.println(HisenseTV......);}
}public interface TVFactory
{public TV produceTV();
}public class HaierTVFactory implements TVFactory
{public TV produceTV(){System.out.println(HaierTVFactory。。。);return new HaierTV();}
}public class HisenseTVFactory implements TVFactory
{public TV produceTV(){System.out.println(HisenseTVFactory。。。);return new HisenseTV();}
}public class Client
{public static void main(String args[]){try{TV tv;TVFactory factory;factory(TVFactory)XMLUtil.getBean();tvfactory.produceTV();tv.play();}catch(Exception e){System.out.println(e.getMessage());}}
}
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{public static Object getBean(){try{//ĵDocumentBuilderFactory dFactory DocumentBuilderFactory.newInstance();DocumentBuilder builder dFactory.newDocumentBuilder();Document doc; doc builder.parse(new File(config.xml)); //ȡıڵNodeList nl doc.getElementsByTagName(className);Node classNodenl.item(0).getFirstChild();String cNameclassNode.getNodeValue();//ͨʵ䷵Class cClass.forName(cName);Object objc.newInstance();return obj;} catch(Exception e){e.printStackTrace();return null;}}
}