简单工厂模式与工厂方法模式
Posted endian11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单工厂模式与工厂方法模式相关的知识,希望对你有一定的参考价值。
- 简单工厂
- 定义:简单工厂模式属于创建型模式,其又被称为静态工厂方法模式,这是由一个工厂对象决定创建出哪一种产品类的实例
- 工厂类
public class CamputerFactory { public static Computer createComputer1(String type) { Computer computer = null; switch (type){ case "Lenovo": computer = new LenovoComputer(); break; case "HP": computer = new HPComputer(); break; default:break; } return computer; } }
- 客户端调用:
@Test public void testSimpleFactory(){ CamputerFactory.createComputer1("Lenovo").start(); }
- 抽象产品:
public interface Computer { void start(); }
- 具体产品:
public class HPComputer implements Computer { private static final String TAG = "HPComputer"; @Override public void start() { System.out.print(TAG+" work==========="); } }
-
使用场景:
-
工厂类负责创建的对象比较少
-
客户只需要知道传入工厂类的参数,而无需关心创建对象的逻辑。
-
优点:使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性
-
缺点:可实例化的类型在编译期间已经被确定。如果增加新类型,则需要修改工厂,这违背了开放封闭原则。简单工厂需要知道所有生成的类型 ,当其子类过多或者子类层次过多时不宜使用
-
- 工厂方法
- 定义:定义了一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。工厂方法使一个类的实例化延迟到子类
- 有如下角色:
- 抽象工厂类
- 具体工厂类
- 抽象产品类
- 具体产品类
- 抽象工厂类(使用abstract class也可以)
public interface Factory <T extends Computer>{ T createComputer(Class<T> clz); }
- 具体工厂类:
public class ConFactory implements Factory { @Override public Computer createComputer(Class clz) { Computer computer = null; String clzName = clz.getName(); try { Class clzz = Class.forName(clzName); computer = (Computer) clzz.newInstance(); } catch (Exception e) { e.printStackTrace(); } return computer; } }
- 客户端调用:
@Test public void testSimpleFactory(){ ConFactory c = new ConFactory(); c.createComputer(LenovoComputer.class).start(); }
- 简单工厂与工厂方法比较
- 对于简单工厂模式,我们都知道其在工厂类中包含了必要的逻辑判断,根据不同的条件来动态实例化相关的类,对客户端来说,这去除了与具体产品的依赖;但与此同时也会带来一个问题:如果我们要增加产品,比如我们要生产苹果计算机,就需要在工厂类中添加一个case分支条件,这违背了开放封闭原则,对修改也开放了。
- 而工厂方法模式就没有违背这个开放封闭原则。如果我们需要生产苹果计算机,就无需修改工厂类,直接创建产品即可
以上是关于简单工厂模式与工厂方法模式的主要内容,如果未能解决你的问题,请参考以下文章