美文网首页
JAVA设计模式-入门版学习攻略-工厂方法以及抽象工厂

JAVA设计模式-入门版学习攻略-工厂方法以及抽象工厂

作者: 林亚希 | 来源:发表于2019-03-27 21:00 被阅读0次

    工厂方法模式

    描述

    定义一个穿件对象的工厂接口,让子类决定实例化哪一个类。

    关键点

    • 抽象工厂类角色:核心,具体工厂角色必须实现的接口或者父类。
    • 具体工厂角色:含有一定的商业逻辑和判断逻辑,在java中往往是一个具体类的实现。
    • 抽象产品角色: 具体产品的的父类(一般是产品的通用特性:如宝马汽车和奥迪汽车通用特性都是汽车)。在java中往往是接口或者抽象类。
    • 具体产品角色:工厂类的具体实现(如生产宝马汽车,奥迪汽车)。

    优点

    1. 符合开-闭原则:新增一种产品,只需增加具体产品类和相对应的工厂子类就可以

    缺点

    新增一种产品需要增加一个产品类和一个具体的子工厂,增加系统负担。

    代码实现

    1.抽象工厂类角色

    public interface CarFactory_m {
        
        public Car_m pruduct();
    }
    
    1. 具体工厂角色
    public class AodiFactory_m implements CarFactory_m{
        public Car_m pruduct() {
            return new AodiCar_m();
        }
    }
    
    public class BmwFactory_m implements CarFactory_m{
        public Car_m pruduct() {
            return new BmwCar_m();
        }
    }
    

    3.抽象产品角色

    //抽象类
    public interface Car_m {
    
        //生产车
        public void create();
    }
    

    4.具体产品角色

    public class BmwCar_m implements Car_m {
        public void create() {
            System.out.println("生产宝马汽车!!!");
        }
    }
    
    
    public class AodiCar_m implements Car_m {
        public void create() {
            System.out.println("生产奥迪汽车!!!");
        }
    }
    

    跟简单工厂的区别

    2个有没优劣之分,只有适合以及不适合。工厂方法的代码就是在简单工厂的基础上再定义了一个工厂的接口,优点很明显。当我们需要增加一种产品的时候,比如增加奔驰汽车。工厂方法的设计模式可以不修改原来代码的基础上,增加1个工厂具体角色,1个具体产品角色就可以。但是简单工厂必须在工厂类上增加业务逻辑。违背了开-闭原则。但是缺点也是很明显,当产品越多时,类会多出很多。

    抽象工厂模式

    描述

    给客户提供一个接口,负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

    关键点

    • 抽象工厂类角色:核心,具体工厂角色必须实现的接口或者父类。
    • 具体工厂角色:含有一定的商业逻辑和判断逻辑,在java中往往是一个具体类的实现。
    • 抽象产品角色: 具体产品的的父类(一般是产品的通用特性:如宝马汽车和奥迪汽车通用特性都是汽车)。在java中往往是接口或者抽象类。
    • 具体产品角色:工厂类的具体实现(如生产宝马汽车,奥迪汽车)。

    优点

    当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。

    缺点

    产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。

    代码实现

    1.抽象工厂类角色

    public interface Factory_a {
    
        //生成汽车
        public Car_a pruductCar();
    
        //生产飞机
        public Plane_a pruductPlane();
    }
    
    1. 具体工厂角色
    public class AodiFactory_a implements Factory_a {
        public Car_a pruductCar() {
            return new AodiCar_a();
        }
    
        public Plane_a pruductPlane() {
            return new AodiPlane_a();
        }
    }
    
    public class BmwFactory_a implements Factory_a {
    
        public Car_a pruductCar() {
            return new BmwCar_a();
        }
    
        public Plane_a pruductPlane() {
            return new BmwPlane_a();
        }
    }
    

    3.抽象产品角色

    //抽象类
    public interface Car_m {
    
        //生产车
        public void create();
    }
    
    
    //抽象类
    public interface Plane_a {
    
        //生产飞机
        public void create();
    }
    
    

    4.具体产品角色

    public class BmwCar_m implements Car_m {
        public void create() {
            System.out.println("生产宝马汽车!!!");
        }
    }
    
    
    public class AodiCar_m implements Car_m {
        public void create() {
            System.out.println("生产奥迪汽车!!!");
        }
    }
    
    public class AodiPlane_a implements Plane_a {
        public void create() {
            System.out.println("生产奥迪飞机!!!");
        }
    }
    
    public class BmwPlane_a implements Plane_a {
        public void create() {
            System.out.println("生产宝马飞机!!!");
        }
    }
    

    对比工厂方法

    抽象方法就是工厂方法的延伸版,可以称之为超级工厂。解决工厂方法中层级单一的问题。

    总结

    简单工厂模式,工厂方法模式,抽象工厂,都是工厂模式。最终目的就是为了解耦。

    相关文章

      网友评论

          本文标题:JAVA设计模式-入门版学习攻略-工厂方法以及抽象工厂

          本文链接:https://www.haomeiwen.com/subject/iewtbqtx.html