[Design Pattern]:Factory

来源:互联网 发布:docker在windows安装 编辑:程序博客网 时间:2024/05/17 09:18
工厂模式(Factory)是我们最常用的模式,是用来创建对象的,它就相当于创建对象的new。
主要有以下三种Factory模式:

Simple Factory模式
专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。

Factory Method模式
将对象的创建交由父类中定义的一个标准方法来完成,而不是其构造函数究竟应该创建何种对象由具体的子类负责决定。

Abstract Factory模式
提供一个共同的接口来创建相互关联的多个对象。

1 - Simple Factory模式:
例:某个应用需要创建大量的Fish类,如Crucian等,而不只是Crap。抽象出的接口Fish里有方法swim()
我们要创建实例时,往往用下面的方法:

Fish crap = new Crap();
Fish crucian = new Crucian();

如果要创建大量的Fish对象,这种方法就显得效率低下。采用简单工厂方法:

interface Fish
{
    public void swim();
}

class Factory
{
    public static Fish factory(String type){
        if (type.equalsIgnoreCase("carp")){
            return new Carp();
        }
        else if (type.equalsIgnoreCase("crucian")){
            return new Crucian();
        }
        else{
            return null;
        }
    }
}

class Carp implements Fish
{
    public void swim(){
        System.out.println("Carp can swim!");
    }
}

class Crucian implements Fish
{
    public void swim(){
        System.out.println("Crucian can swim!");
    }
}

public class Test
{
    public static void main(String args[]){
        Fish carp = Factory.factory("carp");
        carp.swim();
    }
}

2 - Factory Method模式:
在工厂方法中,核心工厂不再负责所有商品创建,它把具体的创建工作交给具体的子类去做。
这样,允许在系统不修改具体工厂角色的情况下创建出新的产品。

interface Creator
{
    public Fish factory();
}

interface Fish
{
    public void swim();
}

class Carp implements Fish
{
    public void swim(){
        System.out.println("Carp can swim!");
    }
}

class Crucian implements Fish
{
    public void swim(){
        System.out.println("Crucian can swim!"); 
    }
}

class CarpCreator implements Creator
{
    public Fish factory(){
        return new Carp();
    }
}

class CrucianCreator implements Creator
{
    public Fish factory(){
        return new Crucian();
    }
}

public class Test
{
    public static void main(String args[]){
        CarpCreator carp = new CarpCreator();
        carp.factory().swim();
    }
}

3 - Abstract Factory模式:
抽象工厂又称工具箱(KIT),它提供一个创建相关或相互依赖对象的接口,无需指定具体类。

使用指南:
1. 一个系统要独立于它的产品的创建、组合和表示时
2. 一个系统要生产多个产品族,而系统只消费其中某一族的产品
3. 当设计者要强调一系列相关的产品对象的设计以便进行联合使用时
4. 当系统提供一个产品类库时,所有产品以同样的接口出现,从而使客户端不依赖于实现

如商品有鱼类和水果类等,同时鱼类可能有热带、温带之分,水果也如此。

interface Creator
{
    public Fish createFish();
    public Fruit createFruit();
}

interface Fish{}
interface Fruit{}

class TropicalFish implements Fish{}
class TropicalFruit implements Fruit{}
class TemperateFish implements Fish{}
class TemperateFruit implements Fruit{}

class TropicalFactory implements Creator
{
    public Fish createFish(){
        return new TropicalFish();
    }
 
    public Fruit createFruit(){
        return new TropicalFruit();
    }
}

class TemperateFactory implements Creator
{
    public Fish createFish(){
        return new TemperateFish();
    }
 
    public Fruit createFruit(){
        return new TemperateFruit();
    }
}

public class Test
{
    public static void main(String args[]){
        TropicalFactory crap = new TropicalFactory();
        crap.createFish();
    }
}

原创粉丝点击