工厂设计模式
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()); } }
-
抽象产品类:一个产品应该有共同方法和抽象方法
public abstract class Product { //产品类的公共方法 public void method1(){ //业务逻辑处理 } //抽象方法 public abstract void method2(); }
-
抽象工厂类:一个工厂也有抽象方法和公共方法,抽象方法是用来创建产品的方法
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); }
-
具体产品类:每个具体产品实现抽象产品类的抽象方法来彰显自己的特点
public class ConcreteProduct1 extends Product {
public void method2() {
//业务逻辑处理
}
}
public class ConcreteProduct2 extends Product {
public void method2() {
//业务逻辑处理
}
}
-
具体工厂类:一个具体的工厂生产什么样的产品由自己决定
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; } }
测试函数
public class Client {
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
Product product = creator.createProduct(ConcreteProduct1.class);
/*
* 继续业务处理
*/
}
}