1、工厂模式概念:
实例化对象,用工厂方法替代new操作。 工厂模式包括工厂方法模式和抽象工厂模式。 抽象工厂模式时工厂方法的拓展。 生活中的工厂:洗漱,上班。。。2、工厂模式的意图:
定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。 工厂方法把实例化的工作推迟到子类中实现。3、什么情况下适合工厂模式?
·有一组类似的对象需要创建。 ·在编码时不能预见需要创建哪种类的实例。 (比如,商店今天引进苹果,香蕉,但是不能预见以后会引进什么品种) ·系统需要考虑拓展性,不应依赖于产品实例如何被创建、组合和表达的细节。4、工厂模式的动机
项目中的现状: 在软件系统中经常面临这“对象”的创建工作,由于需求的变化,这个随行 可能随之也会发生变化,但它却拥有比较稳定的接口。 为此,我们需要提供一种封装机制来隔离出来这个易变对象的变化,从而保持 系统中其他依赖该对象的对象不随着需求变化而变化。 5、基于项目现状将代码进行如下设计: 1、尽量松耦合,一个对象的依赖对象的变化与本身无关。 2、具体产品与客户端剥离,责任分割。HairFactory.java
package imooc.factory;import java.util.Map;/** * 发型工厂 * @author 81488 * */public class HairFactory { /** * 根据类型来创建对象 * @param key * @return * * 缺点:不够智能,每增加一个类型需要添加else if进行再判断 */ public HairInterface getHair(String key){ if("left".equals(key)){ return new LeftHair(); }else if("right".equals(key)){ return new RightHair(); } return null; } /** * 根据类的名称来产生对象(反射机制) * @param className * @return */ //实现映射:再配置文件中用键值对来实现类名和简写的映射 public HairInterface getHairByClassKey(String key){ try { Mapmap = new PropertiesReader().getProperties(); HairInterface hair = (HairInterface) Class.forName(map.get(key)).newInstance(); return hair; } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }}
HairInterface.java
package imooc.factory;/** * 发型接口 * @author 81488 * */public interface HairInterface { //实现了发型 public void draw();}
InHair.java
package imooc.factory;/** * 中分发型 * @author 81488 * */public class InHair implements HairInterface { @Override public void draw() { // TODO Auto-generated method stub System.out.println("------中分发型-----"); }}
LeftHair.java
package imooc.factory;/** * 画了一个左偏分发型 * @author 81488 * */public class LeftHair implements HairInterface { @Override public void draw() { // TODO Auto-generated method stub System.out.println("------左偏分发型-----"); }}
RightHair.java
package imooc.factory;/** * 右偏分发型 * @author 81488 * */public class RightHair implements HairInterface { @Override public void draw() { // TODO Auto-generated method stub System.out.println("------右偏分发型--------"); }}
type.properties
left=imooc.factory.LeftHairright=imooc.factory.RightHairin=imooc.factory.InHair
test.java
package imooc.factory;/** * 模拟客户端实现 * @author 81488 * */ public class test { public static void main(String[] args) {// HairInterface left = new LeftHair();// left.draw(); HairFactory factory = new HairFactory();// HairInterface left = factory.getHair("left");// left.draw(); //利用类名get对象来创建// HairInterface left = factory.getHairByChass("imooc.factory.LeftHair");// left.draw(); HairInterface hair = factory.getHairByClassKey("in"); hair.draw(); } }