学习笔记--设计模式之工厂模式
2016-05-18 10:18
309 查看
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 使用该模式的主要目的是为了解耦和。
工厂模式可以分为三类:
1)简单工厂模式(Simple Factory)
从开闭原则(对扩展开放,对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的车型号的时候,想要一种速度快的新型车,只要这种车符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一个品牌,都要在工厂类中增加相应的创建业务逻辑(createBMW(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。 这时工厂方法模式作出现了, 工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
2)工厂方法模式(Factory Method)
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。
3)抽象工厂模式(Abstract Factory)
工厂模式可以分为三类:
1)简单工厂模式(Simple Factory)
一个抽象产品类,可以派生出多个具体产品类。 一个具体工厂类。 具体工厂类能创建具体产品类的实例。 public class Customer { public static void main(String[] args) { PhoneFactory factory = new PhoneFactory(); Phone mi4 = factory.createPhone("xiaomi"); Phone _4s = factory.createPhone("iphone"); Phone p8 = factory.createPhone("huawei"); } } class PhoneFactory //工厂类 { public Phone createPhone(String brand) { switch(brand) { case "iphone": return new Iphone(); case "xiaomi": return new XiaoMi(); case "huawei": return new HuaWei(); default: break; } return null; } } class Phone//抽象产品 { public Phone(){} } class Iphone extends Phone//具体产品 { public Iphone(){System.out.println("Create Iphone");} } class XiaoMi extends Phone//具体产品 { public XiaoMi(){System.out.println("Creat XiaoMi");} } class HuaWei extends Phone//具体产品 { public HuaWei() {System.out.println("Creat HuaWei");} }
从开闭原则(对扩展开放,对修改封闭)上来分析下简单工厂模式。当客户不再满足现有的车型号的时候,想要一种速度快的新型车,只要这种车符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一个品牌,都要在工厂类中增加相应的创建业务逻辑(createBMW(int type)方法需要新增case),这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类,我们称它为全能类或者上帝类。 这时工厂方法模式作出现了, 工厂类定义成了接口,而每新增的车种类型,就增加该车种类型对应工厂类的实现,这样工厂的设计就可以扩展了,而不必去修改原来的代码。
2)工厂方法模式(Factory Method)
一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 class Phone//抽象产品 { public Phone(){} } class Iphone extends Phone//具体产品 { public Iphone(){System.out.println("Create Iphone");} } class XiaoMi extends Phone//具体产品 { public XiaoMi(){System.out.println("Creat XiaoMi");} } class HuaWei extends Phone//具体产品 { public HuaWei() {System.out.println("Creat HuaWei");} } interface PhoneFactory//抽象工厂 { Phone creatPhone(); } class IphoneFactory implements PhoneFactory //具体工厂 { public Phone creatPhone() { return new Iphone(); } } class XiaoMiFactory implements PhoneFactory //具体工厂 { public Phone creatPhone() { return new XiaoMi(); } } class HuaWeiFactory implements PhoneFactory //具体工厂 { public Phone creatPhone() { return new HuaWei(); } } public class Customer //客户端 { public static void main(String[] args) { Phone mi4 = new XiaoMiFactory().creatPhone(); Phone _4s = new IphoneFactory().creatPhone(); Phone p8 = new HuaWeiFactory().creatPhone(); } }
工厂方法模式仿佛已经很完美的对对象的创建进行了包装,使得客户程序中仅仅处理抽象产品角色提供的接口,但使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。
3)抽象工厂模式(Abstract Factory)
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用