1、工厂模式
工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
1.简单工厂模式(Simple Factory)
2.工厂方法模式(Factory Method)
3.抽象工厂模式(Abstract Factory)
在什么样的情况下我们应该记得使用工厂模式呢?大体有两点:
1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节
换言之:就要有一个工厂,能够生产各种各样的车,我不关注于生产车辆的细节。只关注怎么掉工厂方法产生车。
原生:
package test1;
public class FactoryMethod {
public static void main(String[] args) {
Application application = new Application();
ProductA productA = application.getObject();
productA.method1();
}
}
class ProductA{
public void method1(){
System.out.println("ProductA。method1 executed");
}
}
class Application {
private ProductA creatProduct(){
// ...
return new ProductA();
}
public ProductA getObject(){
ProductA product = creatProduct();
// ...
return product;
}
}
改造后: 简单工厂模式
优点:新增一个商品,若商品符合工厂商品合同,适当修改后就能供客户使用
缺点:每增加一个商品,需要在工厂中增加相应的商业逻辑和判断逻辑,违背了开闭原则
package test1;
public class testFactoryMethod {
public static void main(String[] args) {
Application1 application = new Application1();
Product product = application.getObject("1");
product.method();
}
}
class SimpleFactory{
public static Product createProduct(String type){
if(type.equals("0")){
return new ProductA1();
}else if(type.equals("1")){
return new ProductA2();
}else{
throw new RuntimeException("输入参数有误");
}
}
}
interface Product{
public void method();
}
class ProductA1 implements Product{
public void method(){
System.out.println("ProductA1.method executed");
}
}
class ProductA2 implements Product{
public void method(){
System.out.println("ProductA2.method executed");
}
}
class Application1 {
private Product creatProduct(String type){
// ...
return SimpleFactory.createProduct(type);
}
public Product getObject(String type){
Product product = creatProduct(type);
// ...
return product;
}
}
工厂方法模式:
模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类
//抽象产品
abstract class Car{
private String name;
public abstract void drive();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品
class Benz extends Car{
public void drive(){
System.out.println(this.getName()+"----go-----------------------");
}
}
class Bmw extends Car{
public void drive(){
System.out.println(this.getName()+"----go-----------------------");
}
}
//抽象工厂
abstract class Driver{
public abstract Car createCar(String car) throws Exception;
}
//具体工厂(每个具体工厂负责一个具体产品)
class BenzDriver extends Driver{
public Car createCar(String car) throws Exception {
return new Benz();
}
}
class BmwDriver extends Driver{
public Car createCar(String car) throws Exception {
return new Bmw();
}
}
//老板
public class Boss{
public static void main(String[] args) throws Exception {
Driver d = new BenzDriver();
Car c = d.createCar("benz");
c.setName("benz");
c.drive();
}
}
package test2;
public class testFactoryMethod1 {
public static void main(String[] args) {
Application application = new ConcreateProductB();
Product product = application.getObject();
product.method();
}
}
interface Product{
public void method();
}
class ProductA1 implements Product{
public void method(){
System.out.println("ProductA1.method executed");
}
}
class ProductA2 implements Product{
public void method(){
System.out.println("ProductA2.method executed");
}
}
abstract class Application {
// 工厂方法:
abstract Product creatProduct();
Product getObject(){
Product product = creatProduct();
// ...
return product;
}
}
class ConcreateProductA extends Application{
// 让对应的Product延迟到子类
@Override
Product creatProduct() {
//.. 具体实现逻辑
return new ProductA1();
}
}
class ConcreateProductB extends Application{
@Override
Product creatProduct() {
//.. 具体实现逻辑
return new ProductA2();
}
}
优点:符合开闭原则
缺点:产品种类非常多时,就会出现大量的与之对应的工厂类,这不应该是我们所希望的
抽象工厂模式: 开闭原则 推荐使用
模式定义:提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类
它和工厂方法模式的区别就在于需要创建对象的复杂程度上。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
//抽象产品(Bmw和Audi同理)
abstract class BenzCar{
private String name;
public abstract void drive();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品(Bmw和Audi同理)
class BenzSportCar extends BenzCar{
public void drive(){
System.out.println(this.getName()+"----BenzSportCar-----------------------");
}
}
class BenzBusinessCar extends BenzCar{
public void drive(){
System.out.println(this.getName()+"----BenzBusinessCar-----------------------");
}
}
abstract class BmwCar{
private String name;
public abstract void drive();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class BmwSportCar extends BmwCar{
public void drive(){
System.out.println(this.getName()+"----BmwSportCar-----------------------");
}
}
class BmwBusinessCar extends BmwCar{
public void drive(){
System.out.println(this.getName()+"----BmwBusinessCar-----------------------");
}
}
abstract class AudiCar{
private String name;
public abstract void drive();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class AudiSportCar extends AudiCar{
public void drive(){
System.out.println(this.getName()+"----AudiSportCar-----------------------");
}
}
class AudiBusinessCar extends AudiCar{
public void drive(){
System.out.println(this.getName()+"----AudiBusinessCar-----------------------");
}
}
//抽象工厂
abstract class Driver3{
public abstract BenzCar createBenzCar(String car) throws Exception;
public abstract BmwCar createBmwCar(String car) throws Exception;
public abstract AudiCar createAudiCar(String car) throws Exception;
}
//具体工厂
class SportDriver extends Driver3{
public BenzCar createBenzCar(String car) throws Exception {
return new BenzSportCar();
}
public BmwCar createBmwCar(String car) throws Exception {
return new BmwSportCar();
}
public AudiCar createAudiCar(String car) throws Exception {
return new AudiSportCar();
}
}
class BusinessDriver extends Driver3{
public BenzCar createBenzCar(String car) throws Exception {
return new BenzBusinessCar();
}
public BmwCar createBmwCar(String car) throws Exception {
return new BmwBusinessCar();
}
public AudiCar createAudiCar(String car) throws Exception {
return new AudiBusinessCar();
}
}
//老板
public class BossAbstractFactory {
public static void main(String[] args) throws Exception {
Driver3 d = new BusinessDriver();
AudiCar car = d.createAudiCar("");
car.drive();
}
}
改进后:
/**
* 简单工厂通过反射改进抽象工厂及其子工厂
* @author Administrator
*
*/
class Driver3{
public static BenzCar createBenzCar(String car) throws Exception {
return (BenzCar) Class.forName(car).newInstance();
}
public static BmwCar createBmwCar(String car) throws Exception {
return (BmwCar) Class.forName(car).newInstance();
}
public static AudiCar createAudiCar(String car) throws Exception {
return (AudiCar) Class.forName(car).newInstance();
}
}
//客户端
public class SimpleAndAbstractFactory {
public static void main(String[] args) throws Exception {
AudiCar car = Driver3.createAudiCar("com.java.pattendesign.factory.AudiSportCar");
car.drive();
}
}
另一个例子:
oracle同理:
2、应用场景
详细介绍见:
https://www.cnblogs.com/deityjian/p/10908739.html