设计模式2 工厂模式 推荐使用工厂方法模式和抽象工厂模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值