1.简单工厂(Simple Factory)

<span style="font-size:14px;">//简单工厂设计模式
interface Vehicle        //写一个接口,但是我更喜欢叫它标准,所有符合这个标准的类均归为同一类
{
    public void howToWork();
}
class Car implements Vehicle      //汽车类实现交通工具接口(或者说是汽车类符合交通工具标准)
{
    public void howToWork()
    {
        System.out.println("开车去!");
    }
}
class Bike implements Vehicle 
{
    public void howToWork()
    {
        System.out.println("骑车去!");
    }
}
class Airplane implements Vehicle
{
    public void howToWork()
    {
        System.out.println("坐飞机去!");
    }
}
class Factory             //工厂类
{ 
    public static Vehicle create(String vehicle)  //实现一个静态方法用于创建实例
    {
        Vehicle sample = null;
        switch(vehicle)
        {
            case "car":
                sample = new Car();
                break;</span><span style="font-size:18px;">
            case "bike":
                sample = new Bike();
                break;
            case "airplane" :
                sample = new Airplane();
                break;
        }
        return sample;
    }
}
public class SimpleFactory
{
    public static void main(String args[])
    {
        Vehicle vehicle = Factory.create(args[0]);
        vehicle.howToWork();
    }
}</span>


由上面的代码可以看出,简单工厂的核心就是一个SimpleFactory类,他拥有必要的逻辑判断能力和所有产品的创建权利,我们只需要向把定单给他,就能得到我们想要的产品。这使用起来似乎非常方便。

但,实际上,这个SimpleFactory有很多的局限。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的原代码。其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字...

还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点....

以上的不足将在工厂模式的另外两种状态中得到解决。


2.工厂方法(Factory Method)


<span style="font-size:14px;">interface Vehicle        //写一个接口,但是我更喜欢叫它标准,所有符合这个标准的类均归为同一类
{
    public void howToWork();
}
interface Factory    //工厂方法为工厂类定义了接口,用多态来削弱了工厂类的职能
{
    public Vehicle create();
}

class Car implements Vehicle      //汽车类实现交通工具接口(或者说是汽车类符合交通工具标准)
{
    public void howToWork()
    {
        System.out.println("开车去!");
    }
}
class Bike implements Vehicle 
{
    public void howToWork()
    {
        System.out.println("骑车去!");
    }
}
class Airplane implements Vehicle
{
    public void howToWork()
    {
        System.out.println("坐飞机去!");
    }
}

class UseCar implements Factory
{
    public Vehicle create()
    {
        return new Car();
    }
}
class UseBike implements Factory
{
    public Vehicle create()
    {
        return new Bike();
    }
}
class UseAirplane implements Factory
{
    public Vehicle create()
    {
        return new Airplane();
    }
}
public class FactoryMethod
{
    public static void main(String args[])
    {
        Vehicle vehicle = null;
        if(args[0].equals("car"))
        {
            vehicle = new UseCar().create();
            vehicle.howToWork();
        }
        if(args[0].equals("bike"))
        {
            vehicle = new UseBike().create();
            vehicle.howToWork();
        }
        if(args[0].equals("airplane"))
        {
            vehicle = new UseAirplane().create();
            vehicle.howToWork();
        }
    }
}</span>


3.抽象工厂(Factory Method)

<span style="font-size:14px;">interface Vehicle        //写一个接口,但是我更喜欢叫它标准,所有符合这个标准的类均归为同一类
{
    public String howToWork();
}
class Car implements Vehicle      //汽车类实现交通工具接口(或者说是汽车类符合交通工具标准)
{
    public String howToWork()
    {
        String str = "开车去";
        return str;
    }
}
class Bike implements Vehicle 
{
    public String howToWork()
    {
        String str = "骑车去";
        return str;
    }
}
class Airplane implements Vehicle
{
    public String howToWork()
    {
       String str = "开飞机去";
       return str;
    }
}
//==============================================
interface Breakfast         //早餐接口
{
    public String EatWhat();
}
class Bread implements Breakfast
{
    public String EatWhat()
    {
        String str = "面包";
        return str;
    }
}
class Egg implements Breakfast
{
    public String EatWhat()
    {
        String str = "鸡蛋";
        return str;
    }
}
class Noodles implements Breakfast
{
    public String EatWhat()
    {
        String str = "面条";
        return str;
    }
}
//============================================================
interface Factory     //创建工厂接口
{
    public Vehicle createVehicle();     //定义交通工具
    public Breakfast createBreakfast(); //定义早餐
}
class Poor implements Factory           //实现穷人上班和早餐
{
    public Vehicle createVehicle()
    {
        return new Bike();
    }
    public Breakfast createBreakfast()
    {
        return new Bread();
    }
}
class Rich implements Factory           //实现富人上班和早餐
{
    public Vehicle createVehicle()
    {
        return new Car();
    }
    public Breakfast createBreakfast()
    {
        return new Egg();
    }
}
//=======================================
public class AbstractFactory
{
    public static void main(String args[])
    {
       if(args[0].equals("poor"))
       {
           Poor poor = new Poor();
           System.out.println("穷人早上吃完" + poor.createBreakfast().EatWhat() + poor.createVehicle().howToWork()+"上班");
       }
       else if(args[0].equals("rich"))
       {
           Rich rich = new Rich();
           System.out.println("富人早上吃完" + rich.createBreakfast().EatWhat() + rich.createVehicle().howToWork()+"上班");
       }
    }
}</span><span style="font-size:18px;color: rgb(153, 0, 0);">
</span>