工厂设计模式

2018, Apr 19    

工厂设计模式

工厂模式:让子类决定创建什么样的对象,来达到将对象的创建过程封装的目的

  • 优点:工厂方法拥抱变化,如果要增加一个产品,只需要新增一个具体的产品类就可完成系统扩展

    数据库从MySQL切换到Oracle,需要改动的地方就是切换一下驱动名称(前提 条件是SQL语句是标准语句),其他的都不需要修改。

    如果是用new的话,还要改动代码。

简单工厂:把对象的创建从客户端(简单工厂有多个客户端)代码中调出来(简单工厂并不是一个设计模式,而是一种编程习惯)

/*
 * 简单工厂
 */

// 汽车接口
public interface Car {
    String getName();
}

// 奔驰类
public class Benz implements Car {
    @Override
    public String getName() {
        return "Benz";
    }
}

// 宝马类
public class BMW implements Car {
    @Override
    public String getName() {
        return "BMW";
    }
}

// 简单工厂,既能生产宝马又能生产奔驰
public class SimpleFactory {
    public Car getCar(String name){
        if (name.equals("BMW")){
            return new BMW();
        }else if (name.equals("benz")){
            return new Benz();
        }else {
            System.out.println("不好意思,这个品牌的汽车生产不了");
            return null;
        }
    }
}

public class SimpleFactoryTest {
    public static void main(String[] args){
        SimpleFactory simpleFactory = new SimpleFactory();
        Car car = simpleFactory.getCar("BMW");
        System.out.println(car.getName());
    }
}
  1. 抽象产品类:一个产品应该有共同方法和抽象方法

    public abstract class Product {
    	//产品类的公共方法
    	public void method1(){
    		//业务逻辑处理
    	}
    	//抽象方法
    	public abstract void method2();
    }
    
  2. 抽象工厂类:一个工厂也有抽象方法和公共方法,抽象方法是用来创建产品的方法

    public abstract class Creator {
           
        public Product fixedMethod(Class<T> c) {
            Product product;
            product = createProduct(c);
            // 后面是固定的处理逻辑
        }
       
    	public abstract <T extends Product> T 		createProduct(Class<T> c);
    }
    
  3. 具体产品类:每个具体产品实现抽象产品类的抽象方法来彰显自己的特点

public class ConcreteProduct1 extends Product {
	public void method2() {
		//业务逻辑处理
	}
}
public class ConcreteProduct2 extends Product {
	public void method2() {
		//业务逻辑处理
	}
}
  1. 具体工厂类:一个具体的工厂生产什么样的产品由自己决定

    public class ConcreteCreator extends Creator {
    	public <T extends Product> T createProduct(Class<T> c) {
    		Product product=null;
    		try {
    		product = (Product)Class.forName(c.getName()).newInstance();
    		} catch (Exception e) {
    		//异常处理
    		}
    		return (T)product;
    	}
    }
    

1568882094039

测试函数

public class Client {
	public static void main(String[] args) {
	Creator creator = new ConcreteCreator();
	Product product = creator.createProduct(ConcreteProduct1.class);
	/*
	* 继续业务处理
	*/
	}
}