前言
Android的设计模式系列文章介绍,欢迎关注,持续更新中:java
1.定义
定义一个用于建立对象的接口,让子类决定实例化哪一个类。设计模式
2.介绍
简单工厂模式属于建立型模式。
简单工厂模式又叫作静态工厂方法模式。
3.UML类图
3.1 角色说明:
Product(抽象产品类):要建立的复杂对象,定义对象的公共接口。
ConcreteProduct(具体产品类):实现Product接口。
Factory(工厂类):返回ConcreteProduct实例。
4.实现
4.1 建立抽象产品类,定义公共接口:ide
//抽象产品类
public abstract class Product {
public abstract void show();
}
4.2 建立具体产品类,继承Product类:svg
//具体产品类A
public class ProductA extends Product {
@Override
public void show() {
System.out.println("product A");
}
}
//具体产品类B
public class ProductB extends Product {
@Override
public void show() {
System.out.println("product B");
}
}
4.3 建立工厂类,建立具体的产品:测试
public class Factory {
public static Product create(String productName) {
Product product = null;
//经过switch语句控制生产哪一种商品
switch (productName) {
case "A":
product = new ProductA();
break;
case "B":
product = new ProductB();
break;
}
return product;
}
}
4.4 测试方法:优化
public void test() {
Factory.create("A").show();//生产ProductA
Factory.create("B").show();//生产ProductB
try {
Factory.create("C").show();//生产ProductC
} catch (NullPointerException e) {
System.out.println("没有ProductC");//没有ProductC,会报错
}
}
5.应用场景
生成复杂对象时,肯定只有一个工厂类,可使用简单工厂模式。不然有多个工厂类的话,使用工厂方法模式。
6.优势
代码解耦,建立实例的工做与使用实例的工做分开,使用者没必要关心类对象如何建立。
7.缺点
违背开放封闭原则,若需添加新产品则必须修改工厂类逻辑,会形成工厂逻辑过于复杂。
简单工厂模式使用了静态工厂方法,所以静态方法不能被继承和重写。
工厂类包含了全部实例(产品)的建立逻辑,若工厂类出错,则会形成整个系统都会会受到影响。
8.工厂方法模式与简单工厂模式比较
工厂方法模式有抽象工厂类,简单工厂模式没有抽象工厂类且其工厂类的工厂方法是静态的。
工厂方法模式新增产品时只需新建一个工厂类便可,符合开放封闭原则;而简单工厂模式须要直接修改工厂类,违反了开放封闭原则。
9.简单工厂模式的优化
因为简单工厂模式新增产品时须要直接修改工厂类,违反了开放封闭原则。所以可使用反射来建立实例对象,确保可以遵循开放封闭原则。spa
9.1 反射实现工厂类设计
public class Factory {
public static T create(Class clz) {
Product product = null;
try {
product = (Product) Class.forName(clz.getName()).newInstance();//反射出实例
} catch (Exception e) {
e.printStackTrace();
}
return (T) product;
}
}
9.2 测试方法code
public void test() {
Factory.create(ProductA.class).show();//生产ProductA
Factory.create(ProductB.class).show();//生产ProductB
}
9.3 总结
使用反射来实现工厂类,新增产品时无需修改工厂类,可是使用反射来建立实例对象的话会比正常使用new来建立的要慢。