说起设计模式,不得不从最简单的简单工厂设计模式开始说起。
简单工厂模式:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常具有共同的父类。因为简单工厂模式中用于创建的方法是静态的,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,属于类创建型模式。
首先我们先看看下面这个类图:
在这个类图中,我们可以发现,静态工厂一共有三个对象是不可缺少的
1公共父类(Fruit接口)
2具体的产品类(Apple, Banana)
3静态工厂类(SimpleFactory)
在这里面还有一个角色,那就是客户端使用者(SimpleFactoryClient)。
下面是具体的代码
package net.itaem.create; /** * 接口:代表工厂要生产的对象 * */ public interface Fruit { public void name(); public void price(); }
package net.itaem.create; /** * 具体的产品 * */ public class Apple implements Fruit{ @Override public void name() { System.out.println("the product name is apple"); } @Override public void price() { System.out.println("the apple price is 10"); } }
package net.itaem.create; /** * 具体的产品 * */ public class Banana implements Fruit { @Override public void name() { System.out.println("the product is Banana"); } @Override public void price() { System.out.println("the banana price is 10"); } }
package net.itaem.create; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * 简单工厂设计模式 * * */ public class SimpleFactory { public static Fruit create(String type){ if(type.equals("apple")){ return new Apple(); }else if(type.equals("banana")){ return new Banana(); }else{ throw new RuntimeException("The product " + type + " is not exists"); } } /** * 从默认的路劲下面的fruit.txt读取类型 * @throws IOException * */ public static String getType(){ BufferedReader reader = null; try{ reader = new BufferedReader(new FileReader("./fruit.txt")); String type = reader.readLine(); return type; }catch(IOException e){ e.printStackTrace(); } finally{ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } return null; } }
package net.itaem.create; /** * *为了让客户端的代码更具备灵活性,每次工厂生产的具体产品都可以写在一个文件、xml、properties中, *这样子每次需要修改的时候,不需要修改源代码,直接修改对应的配置文件即可 * *用到的额外知识:文件读写、xml解析、反射 * */ public class SimpleFactoryClient { public static void main(String[] args){ Fruit product = SimpleFactory.create(SimpleFactory.getType()); product.name(); product.price(); } }
fruit.txt内容为
apple客户端每次要修改配置,直接修改fruit.txt配置文件即可(这里可以使用xml, properties等文件)
静态工厂的优点
1)工厂类包含必要的逻辑判断,可以决定什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任。实现了对象的穿件和使用的分离。
2)引入配置文件,可以在不修改任何客户端代码的情况下更换和添加新的具体的产品类,一定程度上可以实现:开闭原则
静态工厂的缺点
1)静态工厂类的责任过大
2)扩展很难。如果要添加一个新的产品,就不得不修改工厂类,破坏了开闭原则