内容简介:工厂模式(Factory Pattern)专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。简单工厂模式(Simple Factory Pattern):又称为肥宅喜爱的各种快乐水(意指本人) 快乐水(产品接口)
工厂模式(Factory Pattern)专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。
简单工厂模式
简单工厂模式(Simple Factory Pattern):又称为 静态工厂方法 (Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂并不属于23种设计模式。
实例
肥宅喜爱的各种快乐水(意指本人) 快乐水(产品接口)
public interface Kls { String name(); } 复制代码
肥宅快乐水-可乐(具体产品)
public class Coke implements Kls { @Override public String name() { return "肥宅快乐水-可乐"; } } 复制代码
快乐水-雪碧(具体产品)
public class Sprite implements Kls { @Override public String name() { return "快乐水-雪碧"; } } 复制代码
快乐水工厂(工厂类)
public class KlsFactory { public static Kls getFzs(String type) throws Exception { Kls fzs = null; if ("coke".equalsIgnoreCase(type)) { fzs = new Coke(); } else if ("sprite".equalsIgnoreCase(type)) { fzs = new Sprite(); } if (Objects.isNull(fzs)) { throw new RuntimeException("没找到快乐水~"); } return fzs; } } 复制代码
肥宅(客户)
public class Fz { @Test public void drink() throws Exception { // 制造可乐 Kls coke = KlsFactory.getFzs("coke"); System.out.println("肥宅开始喝:" + coke.name()); // 制造雪碧 Kls sprite = KlsFactory.getFzs("sprite"); System.out.println("肥宅开始喝:" + sprite.name()); } } 复制代码
UML类图
优点:
-
隐藏了具体实现:像
Coke
和Sprite
,这样的产品,客户端是不需要知道具体实现的,只需知道怎么用; -
客户端只需直接使用对象就好,不需关心对象是怎么
new
出来的; -
接耦:客户端没有
new xxx
这样的硬编码,后期设计者改变框架,各种类(除了工厂类)都有改变,只要工厂类的名字、方法名字没变,客户端的代码,一行都不要动。
缺点:
- 扩展麻烦,需要改动现有代码。如果想要增加一个新的产品类,就需要改动工厂类代码。
- 所有逻辑全放在工厂类,产品一多将变得异常难阅读,一旦出错,就全GG了。
工厂方法模式
工厂方法模式(Factory Method)是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。
实例
接着上面快乐水的例子。将 快乐水工厂 ( KlsFactory
) 抽象出共有方法,再分别实现具体的快乐水生产工厂。
快乐水总工厂
public interface Factory { /** * 制造快乐水 * * @return Kls */ Kls create(); } 复制代码
可乐工厂
public class CokeFactory implements Factory { @Override public Kls create() { return new Coke(); } } 复制代码
雪碧工厂
public class SpriteFactory implements Factory { @Override public Kls create() { return new Sprite(); } } 复制代码
肥宅
public class Fz { @Test public void drink() throws Exception { // 制造可乐 CokeFactory cokeFactory = new CokeFactory(); Kls coke = cokeFactory.create(); System.out.println("肥宅开始喝:" + coke.name()); // 制造雪碧 SpriteFactory spriteFactory = new SpriteFactory(); Kls sprite = spriteFactory.create(); System.out.println("肥宅开始喝:" + sprite.name()); } } 复制代码
扩展芬达快乐水 芬达快乐水
public class Fanta implements Kls { @Override public String name() { return "快乐水-芬达"; } } 复制代码
芬达工厂
public class FantaFactory implements Factory { @Override public Kls create() { return new Fanta(); } } 复制代码
肥宅添加
FantaFactory fantaFactory = new FantaFactory(); Kls fanta = fantaFactory.create(); System.out.println("肥宅开始喝:" + fanta.name()); 复制代码
UML类图
优点:
- 简单工厂模式 的有点全部保留;
- 新增产品,不需要改动现有的代码,只需实现对应的
产品类
、工厂实现类
。
缺点:
-
增加系统负担;
-
当新增产品较多时,会导致代码量剧增;
-
一个工厂只能生产一个产品。
以上所述就是小编给大家介绍的《设计模式 —— 工厂模式》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 设计模式——订阅模式(观察者模式)
- 设计模式-简单工厂、工厂方法模式、抽象工厂模式
- java23种设计模式-门面模式(外观模式)
- 设计模式-享元设计模式
- Java 设计模式之工厂方法模式与抽象工厂模式
- JAVA设计模式之模板方法模式和建造者模式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
无懈可击的Web设计
西德霍姆 / 刘建宁 / 清华大学出版社 / 2009-4 / 59.90元
一个网站,无论视觉上多么美观,内容多么丰富,如果不能面向最广泛的用户群,那它就不算是真正成功的网站。《无懈可击的Web设计:利用XHTML和CSS提高网站的灵活性与适应性》是Web标准设计领域的公认专家Dan Cederholm的倾力之作,向您描述了基于Web标准的设计策略,以适应各种各样的用户浏览方式。书中每一章的开头都给出了一个基于传统HTML技术的实例,然后对它进行重构,指出它的局限性,并利......一起来看看 《无懈可击的Web设计》 这本书的介绍吧!