设计模式-简单工厂
使用工厂方法模式可以应付我们遇到的大部分需求,当产品种类变多的时候,这个时候会出现大量的工厂类,怎么解决这个问题?可以对产品树上类似的种类使用简单工厂模式来实现。也就是说 工厂方法+简单工厂= 抽象工厂。
使用设计模式,主要是为了程序的扩展性。
为什么要使用工厂模式:
- 编码时不能预见要创建哪些类的实例。
- 系统不应该依赖产品类如何被创建,组合和表达的细节。
简单工厂
简单工厂只有一个工厂,也一个产品基类,不同的产品可以继承这个产品基类。
简单工厂代码实现:
public interface Product { } public class ConcreteProduct implements Product { } public class ConcreteProduct1 implements Product { } public class ConcreteProduct2 implements Product { }
Client 需要如果包含实例化代码,这个是错误的:
public class Client { public static void main(String[] args) { int type = 1; Product product; if (type == 1) { product = new ConcreteProduct1(); } else if (type == 2) { product = new ConcreteProduct2(); } else { product = new ConcreteProduct(); } // do something with the product } }
需要把实例化代码放到简单工厂中:
public class SimpleFactory { public Product createProduct(int type) { if (type == 1) { return new ConcreteProduct1(); } else if (type == 2) { return new ConcreteProduct2(); } return new ConcreteProduct(); } }
客户端调用
public class Client { public static void main(String[] args) { SimpleFactory simpleFactory = new SimpleFactory(); Product product = simpleFactory.createProduct(1); // do something with the product } }
简单工厂模式很简单,适用于工厂类不经常更改的情况。
简单工厂包含的角色:
- 工厂类角色:含有一定的业务逻辑和逻辑判断,根据逻辑不同,创建不同的产品。SimpleFactory 就是工厂类角色。
- 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。通过接口或者抽象来实现 product 就是。
- 具体产品角色:工厂类所创建的对象就是此角色的实例。ConcreteProduct1 ConcreteProduct2 就是具体实例。
简单工厂的优缺点
- 符合现实情况,客户端不创建产品,仅使用用产品
- 产品类符合开闭原则,产品扩展开放,工厂类的却不理想,每创建一个具体产品实例,都需要修改代码,因此便有了工厂方法法模式。
参考资料
- 简单工厂,工厂方法,抽象工厂