设计模式:工厂模式
2017-11-05 21:01
357 查看
顾名思义,工厂模式就是能够像工厂一样,不断创建实例对象。在现实中,一个工厂生产一种或者几种产品;一些大厂可能会更复杂一下,不由不同的产品系列,不同系列下又会有不同的种类的产品。
常见的工厂模式有:简单工厂模式、工厂方法模式、抽象工厂模式。
发型接口,里面有一个选择发型的行为(画发型)
几种发型实现
左偏分
中分
右偏分
工厂类
客户端
结果为:
<
83bb
li>不足
当我们又开发出了一种新发型,那么我们就需要在factory中再增加一个判断,修改factory中的代码,这样就违背了 开闭原则 。
解决思路
增加一个配置文件,记录给定的唯一标识到具体实现子类之间的映射关系,应用启动时,将这些映射关系读取到一个map中,这样在factory中只需要做的工作为:1、从map中获取给定的具体实现子类信息;2、根据信息创建实例对象并返回。
实际中,spring就是通过这种方式来管理bean的。通过在spring bean的配置文件中配置bean信息,spring应用启动后,bean配置文件会被解析存储到map中,以后通过BeanFactory获取bean实例对象,就是从map中查找bean信息并实例化的过程。
简单来说,就是什么样的工厂生产什么样的产品,即每个Factory只生产一种具体的产品。就不举例子了。
为了尽可能降低业务中增加或者减少产品的需求会导致对代码的修改影响,建议采用 配置文件+反射 或者 注解+反射 实现自动产品注册,然后给予唯一id获取对应实例。
常见的工厂模式有:简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式
UML类图
实现示例
MYOTee脸萌是曾经比较火的拼脸游戏,其中用户可以选择不同的发型。在这里,我们模拟对不同发型的选择,并简化发型为左偏分、中分、右偏分。发型接口,里面有一个选择发型的行为(画发型)
public interface HairStyle { void drawHair(); }
几种发型实现
左偏分
public class LeftHairStyle impliments HairStyle { @Override public void drawHair(){ System.out.println("我选择了左偏分发型"); } }
中分
public class InHairStyle impliments HairStyle { @Override public void drawHair(){ System.out.println("我选择了中分发型"); } }
右偏分
public class RightHairStyle impliments HairStyle { @Override public void drawHair(){ System.out.println("我选择了右偏分发型"); } }
工厂类
public class HairFactory { public HairStyle chooseHair(String arg) { if(arg.equals("left")) { return new LeftHairStyle(); }else if(arg.equals("in")) { return new InHairStyle(); }else if(arg.equals("right")) { return new RightHairStyle(); } return null; } }
客户端
public class Client { public static void main(String[] args) { HairFactory factory = new HairFacotry(); HairStyle hair = factory.chooseHair("right"); hair.drawHair(); hair=factory.chooseHair("in"); hair.drawHair(); } }
结果为:
我选择了右偏分发型 我选择了中分发型
<
83bb
li>不足
当我们又开发出了一种新发型,那么我们就需要在factory中再增加一个判断,修改factory中的代码,这样就违背了 开闭原则 。
解决思路
增加一个配置文件,记录给定的唯一标识到具体实现子类之间的映射关系,应用启动时,将这些映射关系读取到一个map中,这样在factory中只需要做的工作为:1、从map中获取给定的具体实现子类信息;2、根据信息创建实例对象并返回。
实际中,spring就是通过这种方式来管理bean的。通过在spring bean的配置文件中配置bean信息,spring应用启动后,bean配置文件会被解析存储到map中,以后通过BeanFactory获取bean实例对象,就是从map中查找bean信息并实例化的过程。
工厂方法模式
UML类图
简单来说,就是什么样的工厂生产什么样的产品,即每个Factory只生产一种具体的产品。就不举例子了。
抽象工厂方法
UML类图
总结
简单工厂模式、工厂方法模式、抽象工厂模式的演化主要在于 让每个Factory的生产职责更加专业化 。这样模拟实际生活中,不同产品族、产品系列的概念,让每个Factory职责专一化。为了尽可能降低业务中增加或者减少产品的需求会导致对代码的修改影响,建议采用 配置文件+反射 或者 注解+反射 实现自动产品注册,然后给予唯一id获取对应实例。
相关文章推荐
- (设计模式之一)浅析简单工厂模式
- 设计模式之简单工厂模式
- 23中设计模式之简单工厂模式
- 第一篇 设计模式之简单工厂模式
- 学习php设计模式 php实现工厂模式(factory)
- 【设计模式练习】工厂模式
- 设计模式之:工厂模式
- 设计模式面对面之工厂模式
- 设计模式之桥接与工厂模式的简单书写
- 【论题】+【方案】设计模式和工厂模式
- 设计模式--工厂模式、简单工厂模式
- Java23种设计模式之-----工厂模式在开发中的应用
- 抽象类和接口的区别(里面有适配器设计、工厂设计、代理设计模式)
- 第二个设计模式:工厂方法
- 设计模式-抽象工厂和builder模式
- 设计模式学习---第七节:简单工厂模式
- Java-工厂设计模式-学习实例
- 设计模式 --- 工厂模式 实例
- HeadFirst 设计模式 4工厂模式(披萨店演变)
- php设计模式之工厂模式