设计模式学习-工厂模式

关于设计模式学习初衷:在面试的时候,有四五次都被问到了设计模式的问题,比较遗憾的是,自己一个也没有答上来.开始比较厌恶去参加什么所谓的培训班,开始工作后,有了一些自己的时间,在网上买了<大话设计模式>一书,在读了几张后发现很有意思的一本书,对我启发很大.于是计划在接下来的时间里,对这一块进行集中的学习.

来自网络上的一些资料:

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

介绍

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

关键代码:创建过程在其子类执行。

优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

自己写的一个简单例子:

//抽象产品类
public interface Cars {
    
    
    void GetCar();
}
//实现接口的实体类
public class JeepCar implements Cars {
    
    

    @Override
    public void GetCar() {
        System.out.println("this is JeepCar.");
    }
}
public class SportCar implements Cars {
    
    

    @Override
    public void GetCar() {
        System.out.println("this is SportCar.");
    }

}
//工厂类
public class CarFactory {
    
    
    public Cars GetCar(String carType) {
        if (carType == null) {
            return null;
        }
        if (carType.equalsIgnoreCase("SportCar")) {
            return new SportCar();
        } else if (carType.equalsIgnoreCase("jeepcar")) {
            return new JeepCar();
        }
        return null;
    }
}
//使用工厂,通过传递类型信息来获取实体类的对象
public class FactoryPatternDemo {
    
    
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        Cars jeep = carFactory.GetCar("jeepcar");
        jeep.GetCar();
        Cars sport = carFactory.GetCar("sportcar");
        sport.GetCar();
    }
}

写给自己,也写给读者:在学习这块的时候,按照网上的例子原样写了几次,然后发现照抄是没有意义的.越复制,越迷糊.然后开始参考例子再举例子,然后就开始渐渐领悟了.希望后面的自己,不要一直做复制者,要做一些属于自己的东西.也希望后面的自己能去不断的补充和完善这些东西.领悟更核心的东西.

后续补充摘录:

(1)简单工厂模式是由一个具体的类去创建其他类的实例父类是相同的,父类是具体的。
(2)工厂方法模式是有一个抽象的父类定义公共接口子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
(3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。

Guess you like

Origin blog.csdn.net/qq_30901367/article/details/77775745