工厂方法模式
工厂方法模式定义
定义了一个创建对象对象的接口,但由子类决定要实例化的类时哪一个。工厂方法让类把实例化推迟到子类
通用类图
具体实现
工厂方法模式是把产品的实例化过程封装到工厂类中,这样就降低了客户与具体产品类之间的耦合,客户不需要知道产品对象创建的具体过程,而且如果产品对象的创建过程在后期有改变,那么只需改变工厂方法,而不用改变每一个客户。每一个具体的产品类对应一个具体的工厂类,用于创建该产品,这就是把类的实例化推迟到子类中。客户依赖于工厂类,想要创建某个产品对象,就使用相应的工厂类对象进行创建。
下面就来看看具体的代码实现:
首先是定义一个产品接口Product:
package com.yrs.factoryMethod;
/**
* @Author: yangrusheng
* @Description: 产品接口
* @Date: Created in 10:20 2018/7/25
* @Modified By:
*/
public interface Product {
void printName();
}
然后是具体的产品类ConcreteProduct1、ConcreteProduct2:
package com.yrs.factoryMethod;
/**
* @Author: yangrusheng
* @Description: 产品具体实现类
* @Date: Created in 9:42 2018/7/26
* @Modified By:
*/
public class ConcreteProduct1 implements Product {
public void printName() {
System.out.println(this.getClass().getName());
}
}
package com.yrs.factoryMethod;
/**
* @Author: yangrusheng
* @Description: 产品具体实现类
* @Date: Created in 9:42 2018/7/26
* @Modified By:
*/
public class ConcreteProduct2 implements Product {
public void printName() {
System.out.println(this.getClass().getName());
}
}
有了产品类后就要定义相应的工厂类,下面是工厂接口Factory:
package com.yrs.factoryMethod.ManyFactory;
import com.yrs.factoryMethod.Product;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:27 2018/7/26
* @Modified By:
*/
public interface Factory {
Product createProduct();
}
下面是具体的工厂类Product1Factory、Product2Factory:
package com.yrs.factoryMethod.ManyFactory;
import com.yrs.factoryMethod.ConcreteProduct1;
import com.yrs.factoryMethod.Product;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:26 2018/7/26
* @Modified By:
*/
public class Product1Factory implements Factory {
public Product createProduct() {
return new ConcreteProduct1();
}
}
package com.yrs.factoryMethod.ManyFactory;
import com.yrs.factoryMethod.ConcreteProduct2;
import com.yrs.factoryMethod.Product;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:26 2018/7/26
* @Modified By:
*/
public class Product2Factory implements Factory {
public Product createProduct() {
return new ConcreteProduct2();
}
}
那么最后就是我们的客户类Client:
package com.yrs.factoryMethod.ManyFactory;
import com.yrs.factoryMethod.Product;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:29 2018/7/26
* @Modified By:
*/
public class Client {
public static void main(String[] args) {
Factory factory = new Product1Factory();
Product product = factory.createProduct();
//业务处理
product.printName();
factory = new Product2Factory();
product = factory.createProduct();
//业务处理
product.printName();
}
}
代码在GitHub上的地址:
https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/FactoryMethod/ManyFactory
优点
工厂方法模式的优点:
- 良好的封装性,代码结构清晰。降低模块间的耦合。
- 良好的扩展性
- 屏蔽产品类,调用者只需关心产品类的接口,而无需关心产品类的具体实现
- 典型的解耦框架。符合迪米特法则,也符合依赖倒置原则,当然也符合里氏替换原则。
简单工厂模式
简单工厂模式是定义一个工厂类,该类定义了一个静态的依据产品类型类创建产品对象的方法。工厂类的实现如下:
package com.yrs.factoryMethod.simpleFactory;
import com.yrs.factoryMethod.ConcreteProduct1;
import com.yrs.factoryMethod.ConcreteProduct2;
import com.yrs.factoryMethod.Product;
/**
* @Author: yangrusheng
* @Description: 简单工厂模式
* @Date: Created in 18:19 2018/8/12
* @Modified By:
*/
public class ProductFactory {
public static Product createProduct(String type) {
if ("product1".equals(type)) {
return new ConcreteProduct1();
} else if ("product2".equals(type)) {
return new ConcreteProduct2();
}
return null;
}
}
其他相关的代码:
https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/FactoryMethod/simpleFactory
工厂方法是一个非常实用的模式,但是其缺点是工厂类的扩展比较困难,不符合开闭原则。
参考
- 《设计模式之禅–第2版》
- 《大话设计模式》
相关阅读
当程序员说去「设计模式」时,你是否会一脸懵逼,到底什么是设计模式呢?很多人应该听说过设计模式(Design pattern),又或多或少的看过或用
委派模式有点像代理模式又有点像策略模式。例如:公司老板给项目经理下达任务,将任务全权交给项目经理,由项目经理根据一定的策略将任
放心下载pdf地址:https://u17513197.pipipan.com/fs/17513197-291576928必看理由:荣获2005年第十五届Jolt通用类图书震撼大奖,设计模
因为最近接触到APP设计类似的工作,所以我来梳理一下如今市面上流行的APP导航设计模式以及信息布局设计模式。因为还没有深刻体会到
图片来源图虫:已授站长之家使用网站设计是一个复杂的过程。你知道的,我指的不仅仅是设计和开发部分。总的来说,设计思维过程和决策阶