设计模式之【工厂模式】

工厂模式概念:

实例化对象,用工厂方法取代new操作;

工厂模式包含工厂方法模式和抽象方法模式。

抽象工厂模式是工厂方法模式的扩展;


工厂模式的意图

定义一个工厂来创建对象,可是让子类来决定哪些类须要被实例化;

工厂方法把实例化的工作推迟到子类中去实现。


什么情况下适合工厂模式?

有一组类似的对象须要创建;

在编码时不能预见须要创建哪种类的实例;

系统须要考虑扩展性。不应依赖于产品类实例怎样被创建、组合和表达的细节;


项目需求:

在软件系统中常常面临着“对象”的创建工作,因为需求的变化,这个对象肯能随之也会发生变化,但它却拥有比較稳定的接口。

为此我们须要提供一种封装机制来隔离出这个易变对象的变化。从而保持系统中其它依赖该对象的对象不随着需求变化而变化。


解决之道:

1.尽量松耦合。一个对象的依赖对象的变化与本身无关;

2.详细产品与client剥离,责任切割;


工厂模式方法类图:

设计模式之【工厂模式】



抽象工厂模式类图:

设计模式之【工厂模式】



抽象工厂模式举例:如今有一个抽象硬件工厂,以下有多个详细工厂。生产一系列类似的产品族。如图所看到的:

设计模式之【工厂模式】



应用场景举例:

比方如今计算机里面有一个游戏,游戏里面的角色分为男性、女性、儿童,他们分别须要穿戴不同的服饰,那么这个时候我们通过工厂模式来完毕获取不同的服饰对象。


首先定义一个服饰接口:

/** * 人物服饰接口 * * @author bear * */ public interface ClothingInterface { /** * 为人物画上服饰 */ public abstract void draw(); }
然后定义三个服饰类,它们都是ClothingInterface的实现类:

/** * 男性人物的服饰 * * @author bear * */ public class MensWear implements ClothingInterface { /** * 在UI上为男性人物加入上服饰 */ @Override public void draw() { // TODO Auto-generated method stub System.out.println("**************男装************"); } }


/** * 女性人物的服饰 * * @author bear * */ public class WomansWear implements ClothingInterface { /** * 在UI上为女性人物加入上服饰 */ @Override public void draw() { // TODO Auto-generated method stub System.out.println("**************女装************"); } }


/** * 儿童人物的服饰 * * @author bear * */ public class ChildrensWear implements ClothingInterface { /** * 在UI上为儿童人物加入上服饰 */ @Override public void draw() { // TODO Auto-generated method stub System.out.println("**************童装************"); } }


接着,我们这里来定义服饰工厂类:

import java.util.Map; /** * 服饰工厂 * * @author bear * */ public class ClothingFactory { //存储关键词和类的全路径键值对 private Map<String, String> classNameMap; //工厂构造方法,在方法中初始化map public ClothingFactory(){ PropertiesReader pr = new PropertiesReader(); classNameMap = pr.getProperties(); } /** * 工厂生产方法,依据关键词来生产对象 * 缺点:每次新添加一种类别,都须要在这里添加代码 * * @param key 传入须要的服饰类别 * @return 返回客户须要的服饰 */ /* * public ClothingInterface newInstance(int key){ switch (key) { case Clothing.Men: return new MensWear(); case Clothing.Women: return new WomansWear(); case Clothing.Children: return new ChildrensWear(); default: return null; } } * */ /** * 工厂生产方法,依据关键词来索取类名。利用反射来生产对象 * * @param key * @return */ public ClothingInterface newInstance(String key){ try { //获取到要实例化的类的全路径 String className = classNameMap.get(key); //通过反射的方法来生成新的实例 ClothingInterface clothing = (ClothingInterface)Class.forName(className).newInstance(); //返回新实例 return clothing; } catch (Exception e) { // TODO: handle exception return null; } } }
在构造方法中。通过读取属性。来初始化map。属性读取类的定义例如以下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwgyx.html