工厂模式:属于创建型模式。同我们生活中的厂家很相似。我们并不自己制造(new)产品,而是依靠厂家制造,我们只是拿来使用。简单的说就是让工厂
根据我们的需求给我们new一个对象。
工厂模式又分为工厂方法模式和抽象工厂模式。 工厂方法模式又分为:普通工厂方法,静态工厂方法.
package com.pattern.build.facotry.simple;
/**
* 水果接口
* @author chuer
* @date 2014-7-24 下午6:15:44
* @version V1.0
*/
public interface Fruit {
public void name(); //水果名称
}
package com.pattern.build.facotry.simple;
/**
* 苹果
* @author chuer
* @date 2014-7-24 下午6:16:08
* @version V1.0
*/
public class Apple implements Fruit {
@Override
public void name() {
System.out.println("apple");
}
}
package com.pattern.build.facotry.simple;
/**
* 橘子
* @author chuer
* @date 2014-7-24 下午6:16:19
* @version V1.0
*/
public class Orange implements Fruit {
@Override
public void name() {
System.out.println("orange");
}
}
package com.pattern.build.facotry.simple;
public class FruitFactory {//这个工厂是一个单例模式(针对普通工厂方法)
private FruitFactory(){}
private static FruitFactory factory = new FruitFactory();
public static FruitFactory getInstance(){
return factory;
}
//普通工厂方法模式:
/**
* 根据水果名称 实例化一个水果对象
* @param name
* @return
*/
public Fruit createFruit(String name){
Fruit fruit = null;
if(name.equals("apple")){
fruit = new Apple();
}else if(name.equals("orange")){
fruit = new Orange();
}
return fruit;
}
/**
* 创建苹果
* @return
*/
public Fruit createApple(){
return new Apple();
}
/**
* 创建橘子
* @return
*/
public Fruit createOrange(){
return new Orange();
}
//----------------------------分割线-----------------------------------
//静态工厂方法模式
public static Fruit create_fruit(String name){
Fruit fruit = null;
if(name.equals("apple")){
fruit = new Apple();
}else if(name.equals("orange")){
fruit = new Orange();
}
return fruit;
}
/**
* 创建苹果
* @return
*/
public static Fruit create_apple(){
return new Apple();
}
/**
* 创建橘子
* @return
*/
public static Fruit create_orange(){
return new Orange();
}
}
package com.pattern.build.facotry.simple;
public class Client {
public static void main(String[] args) {
Fruit fruit = FruitFactory.getInstance().createFruit("apple");
fruit.name();
fruit = FruitFactory.getInstance().createFruit("orange");
fruit.name();
}
}
通过代码我们可以看出每种工厂方法模式都有两种写法,其中一种需要我们传递一个标识来确定要创建那种产品,而另一种不需要。
也就是一种是单方法一种是多方法。
优点就是简单易用。但是同样优点也是它的缺点 :当我们要新加一种叫做香蕉的水果时,我们必须修改工厂类。对我们后期维护增加
了一点负担。
抽象工厂模式可以拟补这一缺点。
package com.pattern.build.facotry.abs;
import com.pattern.build.facotry.simple.Fruit;
public interface AbstractFactory {
public Fruit crearFruit();
}
package com.pattern.build.facotry.abs;
import com.pattern.build.facotry.simple.Apple;
import com.pattern.build.facotry.simple.Fruit;
public class AppleFactory implements AbstractFactory {
@Override
public Fruit crearFruit() {
return new Apple();
}
}
package com.pattern.build.facotry.abs;
import com.pattern.build.facotry.simple.Fruit;
import com.pattern.build.facotry.simple.Orange;
public class OrangeFactory implements AbstractFactory {
@Override
public Fruit crearFruit() {
return new Orange();
}
}
看到抽象工厂模式的代码,我们看到确实如果要增加一种水果的话,不用修改原来以后的工厂类,而是重新建立一个类。但是如果存在很多的
水果那么就会出现很多的工厂类。
总之,工厂方法模式和抽象工厂模式各有优势。可以根据自己的真实情况,选择使用。