工厂模式

工厂方法模式分为三种:

一、普通工厂模式,建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

1、创建公共接口

public interface Fruit {

    public void showPrice();
}

 

2、创建产品类,分别为AppleFactory.java和PearFactory.java

public class AppleFactory implements Fruit{

    public void showPrice() {
        System.out.println("$1.1");
    }

}

public class PearFactory implements Fruit{

    public void showPrice() {
        System.out.println("pear price is $0.5");
    }

}

3、创建工厂类

public class SimpleFactoryMethod {
    public Fruit produce(String type) {
        if ("Apple".equals(type)) {
            return new AppleFactory();
        }
        else if ("Pear".equals(type)) {
            return new PearFactory();
        } else {
            System.out.println("输入正确的类型 ");
            return null;
        }
    }
}

4、最后测试类

public class FactoryTest {

    public static void main(String[] args) {
        SimpleFactoryMethod factory = new SimpleFactoryMethod();
        Fruit fruit = factory.produce("Apple");
        fruit.showPrice();
    }
}

5、输出结果:$1.1

 

二、多工厂方法

多工厂方法就是用多个生产产品的方法代替type的分支

public class MultiFactoryMethod {
    
    public Fruit produceApple() {
        return new AppleFactory();
    }
    
    public Fruit producePear() {
        return new PearFactory();
    }

}

 

三、静态工厂方法模式

将上面的多个工厂方法模式里面的方法设置为静态的,不需要创建工厂实例,直接调用即可。

public class MultiFactoryMethod {
    
    public static Fruit produceApple() {
        return new AppleFactory();
    }
    
    public static Fruit producePear() {
        return new PearFactory();
    }

}

工厂模式适合有大量产品需要创建,并且具有共同接口时,可以通过工厂方法模式创建。以上三种模式中,第一种如果传入的type字符串有误,不能正确的创建对象,第三种相对于第二种就不需要实例化工厂类,故大多数情况下都是用第三种静态工厂方法模式。

 

四、工厂方法模式与抽象工厂模式(Abstract Factory)区别

工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:

 

 

工厂方法模式:

一个抽象产品类,可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类只能创建一个具体产品类的实例。

 

抽象工厂模式:

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

一个抽象工厂类,可以派生出多个具体工厂类。

每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。

 

区别:

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

工厂方法创建 "一种" 产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。

抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。

 

先看看工厂方法模式:

产品类:AppleProduct.java和 PearProduct.java

public interface Fruit {

    public void showName();
}
public class AppleProduct implements Fruit{

    public void showName() {
        System.out.println("i am apple");
    }

}
public class PearProduct implements Fruit{

    public void showName() {
        System.out.println("i am pear");
    }

}

工厂类:AppleFactory.java 、PearFactory.java、抽象接口Provider.java

public class AppleFactory implements Provider{

    public Fruit produce() {
        return new AppleProduct();
    }

}
public class PearFactory implements Provider{

    public Fruit produce() {
        return new PearProduct();
    }

}
public interface Provider {

    public Fruit produce();
}

我们看到一个工厂类只生产一个产品类,

测试代码如下:

public class Test {

    public static void main(String[] args) {
        Provider provider = new AppleFactory();
        Fruit fruit = provider.produce();
        fruit.showName();
    }
}

测试结果:

i am apple

ok,这样理解是不是很easy啦。

 

抽象工厂模式:

在农场系统的实现
//两种抽象产品:水果、蔬菜
public interface Fruit
{
}
public interface Veggie
{
}
//四种具体产品:北方水果,热带水果,北方蔬菜,热带蔬菜
//Northern Fruit
public class NorthernFruit implements Fruit
{
private String name;
public NorthernFruit(String name)
{
}
public String getName()
{
return name;
}
public void setName(String name)
{
this. name = name;
}
}
//TropicalFruit
public class TropicalFruit implements Fruit
{
private String name;
public TropicalFruit(String name)
{
}
public String getName()
{
return name;
}
public void setName(String name)
{
this. name = name;
}
}
//NorthernVeggie
public class NorthernVeggie implements Veggie
{
private String name;
public NorthernVeggie(String name)
{
}
public String getName()
{
return name;
}
public void setName(String name)
{
this. name = name;
}
}
//TropicalVeggie
public class TropicalVeggie implements Veggie
{
private String name;
public TropicalVeggie(String name)
{
}
public String getName()
{
return name;
}
public void setName(String name)
{
this. name = name;
}
}
//抽象工厂角色
public interface Gardener
{
public Fruit createFruit(String name);
public Veggie createVeggie(String name);
}
//具体工厂角色:北方工厂,热带角色
public class NorthernGardener implements Gardener
{
public Fruit createFruit(String name)
{
return new NorthernFruit(name);
}
public Veggie createVeggie(String name)
{
return new NorthernVeggie(name);
}
}
public class TropicalGardener implements Gardener
{
public Fruit createFruit(String name)
{
return new TropicalFruit(name);
}
public Veggie createVeggie(String name)
{
return new TropicalVeggie(name);
}
}
这样客户端只需要创建具体工厂的实例,然后调用工厂对象的工厂方法就可以得到所需要的产品对象。

 

posted @ 2016-05-05 16:30  speculator  阅读(150)  评论(0编辑  收藏  举报