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

factory模式的学习

阅读更多
1.Simple Factory模式:

1、 在这里,我们先定义水果(Fruit)接口:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.simplefactory;

public interface Fruit
{
    
void plant();

    
void enableEat();
}

2、 苹果(Apple)是对水果(Fruit)接口的实现:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.simplefactory;

public class Apple implements Fruit
{

    
public void enableEat()
    {
        System.out.println(
"苹果能吃啦");
    }

    
public void plant()
    {
        System.out.println(
"种植苹果");
    }
    
}

3、 葡萄(Grape)是对水果(Fruit)接口的实现:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.simplefactory;

public class Grape implements Fruit
{

    
public void enableEat()
    {
        System.out.println(
"葡萄能吃啦");
    }

    
public void plant()
    {
        System.out.println(
"种植葡萄");
    }

}

4、 鸭梨(Pear)是对水果(Fruit)接口的实现:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.simplefactory;

public class Pear implements Fruit
{

    
public void enableEat()
    {
        System.out.println(
"鸭梨能吃啦!");
    }

    
public void plant()
    {
        System.out.println(
"种植鸭梨");
    }

}

5、定义买水果工厂(FruitFactory)这一过程类:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.simplefactory;

public class FruitFactory
{
    
/**
     * 种植水果
     * 
     * 
@param str
     * 
@return
     
*/
    
public static Fruit plantFruit(String str)
    {
        str 
= str.toLowerCase();
        
if (str.equals("apple"))
            
return new Apple();
        
if (str.equals("grape"))
            
return new Grape();
        
if (str.equals("pear"))
            
return new Pear();
        
return null;
    }

    
/**
     * 吃水果
     * 
     * 
@param str
     * 
@return
     
*/
    
public static Fruit eatFruit(String str)
    {
        str 
= str.toLowerCase();
        
if (str.equals("apple"))
            
return new Apple();
        
if (str.equals("grape"))
            
return new Grape();
        
if (str.equals("pear"))
            
return new Pear();
        
return null;
    }
}

6、 编写测试类:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.simplefactory;

public class Client
{
    
public static void main(String[] args)
    {
        Apple apple 
= (Apple) FruitFactory.plantFruit("apple");
        apple.plant();
        
        Apple appleEat 
= (Apple) FruitFactory.eatFruit("apple");
        appleEat.enableEat();
        
        Grape grape 
= (Grape) FruitFactory.plantFruit("grape");
        grape.plant();
        
        Grape grapeEat 
= (Grape) FruitFactory.eatFruit("grape");
        grapeEat.enableEat();
        
        
        Pear pear 
= (Pear) FruitFactory.plantFruit("pear");
        pear.plant();
        
        Pear pearEat 
= (Pear) FruitFactory.eatFruit("pear");
        pearEat.enableEat();
    }
}

7、 说明:

A:我要购买苹果,只需向工厂角色(BuyFruit)请求即可。而工厂角色在接到请求后,会自行判断创建和提供哪一个产品。

B:但是对于工厂角色(FruitFactory)来说,增加新的产品(比如说增加草莓)就是一个痛苦的过程。工厂角色必须知道每一种产品,如何创建它们,以及何时向客户端提供它们。换言之,接纳新的产品意味着修改这个工厂。

C:因此Simple Factory模式的开放性比较差。


 

有什么办法可以解决这个问题吗?那就需要Factory Method模式来为我们服务了。

二、Factory Method模式:

1、同样,我们先定义水果(Fruit)接口:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;

public interface Fruit
{
    
void plant();
}


 

2、苹果(Apple)是对水果(Fruit)接口的实现:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;

public class Apple implements Fruit
{

    
public void plant()
    {
        System.out.println(
"plant apple");
    }
    
}


 

3、葡萄(Grape)是对水果(Fruit)接口的实现:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;

public class Grape implements Fruit
{

    
public void plant()
    {
        System.out.println(
"plant grape");
    }

}


 

4、鸭梨(Pear)是对水果(Fruit)接口的实现:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;

public class Pear implements Fruit
{

    
public void plant()
    {
        System.out.println(
"plant pear");
    }

}


 

5、在这里我们将买水果(FruitFactory)定义为接口类:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;

public interface FruitFactory
{
    Fruit plantFruit();
}


 

6、种植苹果是(PlantApple)对水果工厂(FruitFactory)这个接口的实现

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;

import com.pattern.factorymethod.FruitFactory;

public class PlantApple implements FruitFactory
{

    
public Fruit plantFruit()
    {
        
return new Apple();
    }

}


 

7、种植鸭梨是(PlantBear)对水果工厂(FruitFactory)这个接口的实现

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;

public class PlantPear implements FruitFactory
{
    
public Fruit plantFruit()
    {
        
return new Pear();
    }

}


 

8、种植葡萄是(PlantGrape)对水果工厂(FruitFactory)这个接口的实现

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;

public class PlantGrape implements FruitFactory
{

    
public Fruit plantFruit()
    {
        
return new Grape();
    }

}


 

9、编写测试类:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.factorymethod;
/**
 * 测试类
 * 
@author supercrsky
 *
 
*/
public class Client
{
    
public static void main(String[] args)
    {
        FruitFactory factory 
= new PlantApple();
        factory.plantFruit().plant();
        
        factory 
= new PlantGrape();
        factory.plantFruit().plant();
        
        factory 
= new PlantPear();
        factory.plantFruit().plant();
    }
}

 

10、说明:

A:工厂方法模式和简单工厂模式在结构上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。工厂方法模式可以允许很多具体工厂类从抽象工厂类中将创建行为继承下来,从而可以成为多个简单工厂模式的综合,进而推广了简单工厂模式。

B:工厂方法模式退化后可以变得很像简单工厂模式。设想如果非常确定一个系统只需要一个具体工厂类,那么就不妨把抽象工厂类合并到具体的工厂类中去。由于反正只有一个具体工厂类,所以不妨将工厂方法改成为静态方法,这时候就得到了简单工厂模式。

C:如果需要加入一个新的水果,那么只需要加入一个新的水果类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的水果类而言,这个系统完全支持“开-闭”原则。

D:对Factory Method模式而言,它只是针对一种类别(如本例中的水果类Fruit),但如果我们还想买肉,那就不行了,这是就必须要Abstract Factory Method模式帮忙了。



 

三、Abstract Factory模式

1、同样,我们先定义水果(Fruit)接口:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.abstractfactory;

public interface Fruit
{
    
void plant();
}

 


 

2、苹果(Apple)是对水果(Fruit)接口的实现:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.abstractfactory;

public class Apple implements Fruit
{
    
public void plant()
    {
        System.out.println(
"种植苹果");
    }
}

 


 

2、 定义肉(Meat)接口:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.abstractfactory;

public interface Meat
{
    
void feed();
}

 


 

3、 猪肉(PigMeat)是对肉(Meat)接口的实现:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.abstractfactory;

public class PigMeat implements Meat
{

    
public void feed()
    {
        System.out.println(
"猪肉");
    }

}

 


 

4、 牛肉(CowMeat)是对肉(Meat)接口的实现:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.abstractfactory;

public class CowMeat implements Meat
{

    
public void feed()
    {
        System.out.println(
"牛肉");
    }

}

 


 

5、 我们可以定义工厂接口:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.abstractfactory;

public interface Factory
{
    
// 种水果
    Fruit plantFruit(Fruit fruit);

    
// 养肉
    Meat feedMeat(Meat meat);
}

 


 

6、 我(MyFactory)是对Factory接口的实现:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.abstractfactory;

public class MyFactory implements Factory
{
    
// 养肉的工厂方法
    public Meat feedMeat(Meat meat)
    {
        
return meat;
    }

    
// 种水果的工厂方法
    public Fruit plantFruit(Fruit fruit)
    {
        
return fruit;
    }
}

 

 

7、编写测试类:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package com.pattern.abstractfactory;

public class Client
{
    
public static void main(String[] args)
    {
        Fruit apple 
= new Apple();
        Meat pigMeat 
= new PigMeat();
        Factory factory 
= new MyFactory();
        
// 种植苹果
        factory.plantFruit(apple);
        
// 养殖猪肉
        factory.feedMeat(pigMeat);
    }
}

 

 

8、说明:

A:抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。这就是抽象工厂模式的用意。

B抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。

posted on 2008-05-23 16:03 々上善若水々 阅读(60) 评论(0)  编辑  收藏 所属分类:

分享到:
评论

相关推荐

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。

    设计模式C++学习之抽象工厂模式(AbstractFactory)

    抽象工厂模式是设计模式中的一种结构型模式,它在C++编程中有着广泛的应用。这个模式主要用于创建一系列相关的对象,而无需指定它们的具体类。在本文中,我们将深入探讨抽象工厂模式的概念、工作原理以及在C++中的...

    工厂方法模式(FactoryMethod)

    至于标签中的“源码”,可能是指博客中提供了工厂方法模式的示例代码,供读者学习和参考。“工具”可能是指工厂方法模式作为一种设计工具,可以用来优化和结构化代码。 在提供的文件列表中,“FactoryMethod”可能...

    设计模式C++学习之工厂方法模式(Factory Method)

    设计模式C++学习之工厂方法模式(Factory Method)

    java 设计模式 Facade外观模式 Simple Factory 简单工厂模式

    总的来说,Facade模式和Simple Factory模式是Java设计模式中的重要组成部分,它们分别解决了简化复杂系统接口和对象创建的问题。学习和运用这些模式,不仅可以提高代码质量,还能使软件更加灵活,适应未来可能的变化...

    Factory Method 工厂方法模式(创建型模式)

    ### Factory Method 工厂方法模式(创建型模式) #### 概述 在软件工程领域,设计模式是...通过学习这些书籍,开发者可以更深入地理解 Factory Method 模式以及其他设计模式的原理与实践方法,从而提升自己的设计水平。

    设计模式学习笔记总结

    这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...

    设计模式学习笔记大全

    以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...

    C++的设计模式学习资料

    ### C++的设计模式学习资料详解 #### 一、引言 设计模式是在软件工程领域内广泛应用的一种编程思想,它能够帮助开发者解决常见的设计问题,并提供一套标准的解决方案。设计模式通常分为三大类:创建型模式、结构型...

    AbstractFactory案例代码

    在软件设计领域,设计模式是一种被广泛接受的解决常见问题的最佳实践。抽象工厂(Abstract Factory)模式是其中一种...通过分析这个案例,我们可以学习如何在实际项目中应用抽象工厂模式来提高代码的复用性和可扩展性。

    java工厂模式SimpleFactory

    在实际应用中,SimpleFactory模式可能存在一些局限性,例如,当产品种类增多时,工厂类可能会变得过于复杂,违背了“单一职责原则”。这时,可以考虑使用更高级的工厂模式,如AbstractFactory(抽象工厂)或者...

    C#设计模式之AbstractFactory

    在"小龙谈C#"系列中,讲解了如何在C#中应用Abstract Factory模式。通过这个系列,我们可以学习到以下关键知识点: 1. **抽象工厂接口**:这是模式的核心,它定义了一系列创建对象的方法,但不具体实现这些方法。...

    AbstractFactory设计模式源码

    抽象工厂(Abstract Factory)设计模式是一种创建型设计模式,它提供了一种创建对象族的接口,而无需指定它们的具体类。这种模式适用于当系统需要...在这个源码中,我们可以学习如何将这一模式应用到实际的C++项目中。

    设计模式工厂方法模式PPT学习教案.pptx

    本学习教案旨在讲解设计模式中的工厂方法模式(Factory Method),通过学习本教案,学生将掌握工厂方法模式的定义、结构、实例、分析和应用。 模式动机与定义 在软件设计中,我们经常需要创建对象,但是在什么时候...

    factory

    标题中的"factory"很可能指的是软件设计模式中的"工厂模式",这是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建对象时,我们不会对客户端暴露创建逻辑,而是引用一个共同的接口来指向...

    李建忠 C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

    **抽象工厂模式(Abstract Factory ...通过学习抽象工厂模式,开发者能够更好地理解和运用面向对象设计原则,提高软件的灵活性和可扩展性。在实际开发过程中,灵活运用设计模式能够使代码结构更加清晰,降低维护成本。

    C++设计模式学习框架

    "C++设计模式学习框架"是一个专为学习和实践这些模式而构建的资源集合,它涵盖了各种常见的设计模式,帮助开发者深入理解并熟练应用到实际项目中。 设计模式通常分为三类:创建型模式(Creational Patterns)、结构...

    设计模式 学习伴侣 head first

    在学习过程中,配合《HeadFirst设计模式学习伴侣.jpg》这样的图片资料,可以更好地理解书中的实例和示意图,加深对设计模式本质的理解。这本书不仅适合初学者,也适合有一定经验的开发者用来巩固和提升设计能力。...

    设计模式之美—学习笔记

    这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory Method)和抽象工厂模式(Abstract Factory)。单例模式确保一个类只有一个实例,并提供全局访问点,常用于配置中心或者线程池等。工厂...

    设计模式学习系列2设计模式影印版

    《设计模式学习系列2设计模式影印版》作为一套学习资料,专注于介绍设计模式的核心理念与实践应用,为读者提供了一个系统性的学习框架。 设计模式主要分为三类:创建型模式、结构型模式和行为型模式。其中,创建型...

Global site tag (gtag.js) - Google Analytics