`
zddava
  • 浏览: 243671 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

了解设计模式 之 创建模式(一) -- 工厂模式

阅读更多
最近突发奇想,觉得学会了再多的框架、技术标准,很多因为没有什么机会使用,过段时间就全都忘掉了,还是真正感悟一些方法性的东西比较合适,有很多东西需要用的时候再学是完全来得及的。

说实话,设计模式的书也看过两遍了,不过总感觉还是记不住,最近发现一个好方法,把学习的心得贴出来,在写文章的时候可以更深入的了解要学习的知识,这也算我的一个学习方法吧。

闲话少说,进入正题。

设计模式总的来说可以分成三类:创建模式,结构模式,行为模式。

这篇文章主要讲的是创建模式的相关内容,创建模式主要包括工厂模式(Factory Pattern),建造者模式(Builder Pattern),原型模式(Prototype Pattern)和单例模式(Singleton Pattern),下面会一一的去解说。

1. 工厂模式(Factory Pattern)

说到工厂模式,每个人都会或多或少的有所了解。可能有些人会很快的在心里出现下面的这段代码:

public class SimpleFactory {

	public Interface getInstance(String type) {
		if (type.equals("type1")) {
			return Product1;
		} else if (type.equals("type2")) {
			return Product1;
		} else {
			return DefaultProduct;
		}
	}
}


其实不然,这个#getInstance()方法是一种编程的小技巧,它把会变化的地方封装了起来(Encapsulate what varies),满足了设计的法则,但同时,当需求变更的时候,比如增加了更多种类的包子的时候,就要打开代码,重写getInstance()方法了,这是它的一个弊病。

而正宗的工厂模式又是什么样的呢?

下面来看一下工厂模式的其中一种,工厂方法模式(Factory Method Pattern)。

还是上边的例子,用工厂方法模式重写之后的代码如下所示:

public abstract class Factory {

	public abstract Interface getInstance() {
	}

	public void someOperation() {
		Interface i = getInstance();
		i.someOperation();
	}
}


这样,对于不同的Interface实现,就可以使用不同的工厂了。

public class ConcreteFactory extends Factory{
	public Interface getInstance() {
		return new Product1();
	}
}


客户端程序可以这样编写

public class Client {
	public static void main(String[] args){
		test();
	}

	public static void test() {
		Factory fac = new ConcreteFactory();
		fac.someOperation();
	}
}


这个就是工厂方法模式定义了一个生成对象的接口(Factory),但是让子类(ConcreteFactory)去决定到底要产生什么对象。

它的类图如下所示:



而另外一种工厂模式就是抽象工厂模式了(Abstract Factory Pattern),举一个现实一点的例子。

有一个很NB的方便面厂,它的方便面已经生产到了全国各主要城市,包括:北京,上海,杭州等等。

可是每个地方的人口味都不太一样(至少我了解到的是康师傅的方便面在杭州有东坡肉口味的,北方就没有),包括面饼和调料都是不一样的,所以导致了生产方便面时工艺的不同。

现在这个方便面公司请你来做一个订购方便面的系统,这个时候就可以让抽象工厂模式派上用场了。

可以先定义一个方便面类(其实是面饼)

public abstract class InstantNoodle{// 这个就是面饼类了
}


public abstract class Condiment{// 这个是调味品类
}


这两个加到一起就是一袋方便面了。

然后来定义一个抽象工厂

public abstract class Factory{
	public InstantNoodle createInstantNoodle();

	public Condiment createCondiment();
}


这样,所有的接口都定义完了,下面来看一下实现类。

比如说我要实现北京口味的方便面,那么我要做的是定义一个关于北京的工厂类。

public class BeijingFactory extends Factory{
	public InstantNoodle createInstantNoodle(){
		return new BeijingInstantNoodle();
	}

	public Condiment createCondiment(){
		return new BeijingCondiment();
	}
}


这里BeijingInstantNoodle和BeijingCondiment分别是继承了InstantNoodle和Condiment的特定面饼和调味品类。

另外如果还要生产杭州口味的方便面和调味品的话可以这样实现:

public class HangzhouFactory extends Factory{
	public InstantNoodle createInstantNoodle(){
		return new HangzhouInstantNoodle();
	}

	public Condiment createCondiment(){
		return new HangzhouCondiment();
	}
}


同样,HangzhouInstantNoodle和HangzhouCondiment分别是继承了InstantNoodle和Condiment的特定面饼和调味品类。

最后来写一个生产方便面的类,他需要一个具体的工厂作为传入的参数。

public class InstantNoodleStore(){
	Factory factory = null;
	public InstantNoodleStore(Factory factory){
		this.factory = factory;
	}

	public BaggedInstantNoodle create(){// 生产方便面(BaggedInstantNoodle,这个是最终的袋装的产品)
		InstantNoodle = factory.createInstantNoodle();
		Condiment = factory.createCondiment();
		return new BaggedInstantNoodle(InstantNoodle, Condiment);// 根据面饼和调味料制作袋装方便面
	}
}


最后再写一个客户端程序

public class Client{
	public static void main(String[] args){
		test();
	}
	public static void test() {
		// 制作北京口味的
		Factory factory = new BeijingFactory();
		InstantNoodleStore store = new InstantNoodleStore(factory);
		store.create();

		// 制作杭州口味的
		factory = new HangzhouFactory();
		store = new InstantNoodleStore(factory);
		store.create();
	}
}


这个就是抽象工厂模式了,它提供了一个创建相关联对象的接口,而不用知道这些相关联对象的具体实现类是什么。

它的类图如下所示:



有些人可能会说,用两个工厂方法模式不就可以实现抽象工厂了吗?我的答案是抽象工厂模式生成的产品间会有一定的关系,比如上边例子中写的都是同一个地域口味的产品。可以说,工厂方法模式重视的是对象的创建,代码是围绕创建这个主题的,而抽象工厂模式强调的是产品线的概念,每次都会生成一些列具有逻辑上相关的对象,代码是围绕在统一产品线,令同一个工厂可以生成一些列整齐划一的产品这个主题的。

  • 大小: 14.4 KB
  • 大小: 20.5 KB
分享到:
评论

相关推荐

    创建型设计模式---工厂设计模式实现

    创建型设计模式---工厂设计模式实现

    设计模式学习笔记(一)--简单工厂模式源码

    简单工厂模式是软件设计模式中的一种基础模式,它属于创建型模式,主要解决对象的创建问题,降低了系统与具体创建对象之间的耦合度。在这个学习笔记中,我们将深入理解简单工厂模式的概念、工作原理以及如何在实际...

    JAVA设计模式(01):创建型-工厂模式【简单工厂模式】(Simple Factory)

    **简单工厂模式**是软件设计模式中的一种,属于创建型模式。在Java编程中,它是一种用于创建对象的简便方法,将对象的实例化过程封装到一个单独的工厂类中,使得客户端代码无需直接调用具体类的构造函数,而是通过...

    设计模式之创建型模式实验.docx

    【设计模式之创建型模式实验】 创建型设计模式主要关注对象的创建,它们提供了一种在不指定具体类的情况下创建对象的方式,增强了系统的灵活性和可扩展性。在本实验中,我们将探讨五种常见的创建型设计模式:简单...

    3.java设计模式-创建者模式-抽象工厂模式.pdf

    抽象工厂模式是创建型设计模式中的一种,用于创建一系列相关或相互依赖的对象,而无需指定其具体类。抽象工厂模式强调产品的系列,对于有多个产品等级结构的系统非常有用。在抽象工厂模式中,一个工厂负责创建多个...

    创建型设计模式----抽象工厂模式

    抽象工厂模式是创建型设计模式的一种,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定具体类。这种模式的核心在于它允许客户端代码与具体实现细节解耦,使得更换一个产品族变得更为容易。...

    JAVA-设计模式-创建型模式-工厂模式

    JAVA-设计模式-创建型模式-工厂模式

    设计模式之追MM---浅显易懂

    工厂方法模式是一种创建型设计模式,它定义了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 **示例场景:** 文章中通过带MM去麦当劳吃汉堡的例子来解释工厂方法模式。当你...

    模式之一工厂模式-------------------------

    工厂模式属于创建型设计模式,它的主要目的是通过提供一个统一的接口来创建对象,使得客户端代码无需关心具体对象的创建过程,只需通过工厂方法调用来获取所需的对象。 在工厂模式中,我们通常定义一个抽象工厂类,...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    设计模式是软件工程中的一种最佳实践,用于解决在软件开发过程中常见的问题。这些模式是由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位大师,通常被称为GoF(Gang of Four),在他们的经典著作...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    **设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式进行深入探讨。 #### 二、设计模式的基本定义 ...

    设计模式之蝉

    还有“工厂模式”(Factory pattern),它是创建型设计模式之一,用于创建对象而不暴露创建逻辑给客户端,并且通过使用一个共同的接口来指向新创建的对象。这种模式在创建对象时提供了更高的灵活性和可扩展性。在...

    设计模式UML图--工厂模式

    设计模式是软件工程中的一种最佳实践,用于解决常见的设计问题并提供可重用的解决方案。在给定的“设计模式UML图--工厂模式”中,我们关注的是三种不同的工厂模式:简单工厂、工厂方法和抽象工厂。这些模式都是创建...

    1.java设计模式-创建者模式-简单工厂模式.pdf

    简单工厂模式是Java设计模式中创建型模式的一种,也被称为静态工厂方法模式。该模式的主要思想是由一个专门的工厂类来负责创建其他类的实例。简单工厂模式通过封装创建对象的过程,使得调用者无需关心对象的具体创建...

    c++设计模式-工厂方法模式

    工厂方法模式是面向对象设计模式中的一个创建型模式,它提供了一种封装对象创建过程的方式,使得具体的对象创建过程可以延迟到子类中进行。在C++编程中,工厂方法模式广泛应用于各种软件设计中,因为它能有效地解耦...

    设计模式之美——教你写出高质量代码

    设计模式是软件工程中的一种最佳实践,它是在特定上下文中解决常见问题的经验总结。"设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式...

    设计模式代码示例C#版---研究设计模式的必备

    在软件开发领域,设计模式是经过时间和实践验证的解决方案模板,用于解决常见编程问题。C#作为.NET框架的主要编程语言,拥有丰富的设计模式支持。这个压缩包中的代码示例为学习和理解C#设计模式提供了宝贵的资源。...

    设计模式--抽象工厂模式实现多数据库连接

    抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...

    设计模式系列编程源码----简单工厂模式

    简单工厂模式是软件设计模式中的一种创建型模式,它的主要思想是定义一个工厂类,这个类负责创建对象,客户端通过调用工厂类的特定方法来获取所需的对象,而无需关心对象是如何被创建的。这种模式将对象的创建过程...

    设计模式 - 抽象工厂模式

    抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。 在...

Global site tag (gtag.js) - Google Analytics