工厂方法模式分为三种:
1、普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建
 

interface Animal { // 定义一个动物的接口 
    public void say(); // 说话方法 
}  
   
class Cat implements Animal { // 定义子类Cat 
    @Override 
    public void say() { // 覆写say()方法 
        System.out.println("我是猫咪,喵!");  
    }  
}  
   
class Dog implements Animal { // 定义子类Dog 
   
    @Override 
    public void say() { // 覆写say()方法 
        System.out.println("我是小狗,汪!");  
    }  
}  
   
class Factory { // 定义工厂类 

    public static Animal getInstance(String className) {  
        Animal a = null; // 定义接口对象 
        if ("Cat".equals(className)) { // 判断是哪个子类的标记 
            a = new Cat(); // 通过Cat子类实例化接口 
        }  
        if ("Dog".equals(className)) { // 判断是哪个子类的标记 
            a = new Dog(); // 通过Dog子类实例化接口 
        }  
        return a;  
    } 

        
    public static Animal getInstance2(Object object) {  
        Animal a = null; // 定义接口对象 
        if (object instanceof Cat) { // 判断是哪个子类的标记 
            a = new Cat(); // 通过Cat子类实例化接口 
        }  
        if (object instanceof Dog) { // 判断是哪个子类的标记 
            a = new Dog(); // 通过Dog子类实例化接口 
        }  
        return a;  
    }
    
}  
   
public class FactoryDemo {  
   
    public static void main(String[] args) {  
        Animal a = null; // 定义接口对象 
        
        a = Factory.getInstance("Dog"); // 通过工厂获取实例 
        if (a != null) { // 判断对象是否为空 
            a.say(); // 调用方法  
        } 
        
        a=Factory.getInstance2(new Dog());
        if (a != null) { // 判断对象是否为空 
            a.say(); // 调用方法  
        }  
    }  
} 

2.工厂方法模式,工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做

//抽象产品角色
public interface Moveable {
    void run();
}

//具体产品角色
public class Plane implements Moveable {
    @Override
    public void run() {
        System.out.println("plane....");
    }
}

//具体产品角色
public class Broom implements Moveable {
    @Override
    public void run() {
        System.out.println("broom.....");
    }
}

//抽象工厂
public abstract class VehicleFactory {
    abstract Moveable create();
}

//具体工厂
public class PlaneFactory extends VehicleFactory{
    public Moveable create() {
        return new Plane();
    }
}

//具体工厂
public class BroomFactory extends VehicleFactory{
    public Moveable create() {
        return new Broom();
    }
}

//测试类
public class Test {
    public static void main(String[] args) {
        VehicleFactory factory = new BroomFactory();
        Moveable m = factory.create();
        m.run();
    }
}
01-03 14:02