Java 工厂模式
积少成多 ---- 仅以此致敬和我一样在慢慢前进的人儿
相关内容:
https://www.cnblogs.com/kubixuesheng/p/10344427.html#_label0
https://www.jianshu.com/p/5305eab7b93b
https://www.cnblogs.com/betterboyz/p/9355777.html
一、 简单工厂模式(简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式)
问题一: 什么是简单工厂模式
查询资料: 通过专门定义一个类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。
个人理解: 现在用户创建类的方式发生改变,原来的时候是通过 new 一个对象,现在我们可以将对象的创建交给工厂来创建,只需要告诉工厂用户需要什 么工厂帮你生成这个类, 工厂是用来批量创建实例的,所有这里面的类一般具有一定的公共的特性
问题二、实际案列分析
案例背景: 用户想要喝不同鲜榨水果汁, 工厂帮你创建水果并帮你榨汁
public interface Fruit(){ public void doJuice(); }
// 苹果
public class apple implements Fruit(){
@Overwrited
public void doJuice(){
System.out.print("为你提供一杯鲜榨苹果汁");
}
}
// 橙子
public Class orange implements Fruit(){
@Overwrited
public void dJuice(){System.out.print("为你提供一杯鲜榨苹果汁");
}
}
// 工厂类
public class FruitFactory(){
public Fruit createFruit(String fruit) throw Exception(这里不知道抛出什么异常)
Fruit fru = Class.forName(fruit).newInstance(); (使用的是反射机制,创建类,也可以通过其他方式创建类)
return fru;
}
}
// 用户
public class client(){
pubic static void main(String[] args){
FruitFactory factory = new FruitFactory();
Fruit apple =factory.createFruit("apple");(这里面可能是全类名,com.qf.apple)
Fruit orange =factory.createFruit("orange");
apple.doJuice();
orange.doJuice();
}
}
输出结果:
为你提供一杯鲜榨苹果汁
为你提供一杯鲜榨苹果汁
请你记住自己敲击一遍,量变引起质变
问题三、我为什么要使用它来创建对象(优点)
查询资料:将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,明确了职责。把初始化实例时的工作放到工厂里进行,使代码更容易 维护。 更符合面向对象的原则,面向接口编程,而不是面向实现编程。
个人理解:就是现在使用者可以专注于我们代码逻辑方面的事情,我们不需要去关心创建对象的过程,将这个对象创建的过程全部放在这个类里面
问题四、 它有什么缺点
查阅资料:
- 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
- 要新增产品类的时候,就要修改工厂类的代码,违反了开放封闭原则(对扩展的开放,对修改的关闭)。
- 简单工厂模式由于使用了静态工厂方法,静态方法不能被继承和重写,会造成工厂角色无法形成基于继承的等级结构。
二、 工厂方法模式
问题一、什么是工厂模式?
查阅资料: 是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,
通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品
工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。
核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接
口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
个人理解: 原来在简单工厂模式的时候 ,类的创建是由一个工厂类的静态方法来创建的,没有一个工厂接口,这就导致在简单工厂模式中
当需要进行功能的扩展的时候,需要修改很多东西,违反了开闭原则(对扩展开放,对修改关闭),现在就是使用了一个工厂接口
那么在新的产品需要的时候,只需要创建实现工厂接口的对应新产品的工厂类就可以了,这样扩展性就加强了,算是对简单工厂模式
的改进,更加的体现了面向对象,面向接口编程。
问题二、案列分析
案列背景: 我想要吃雪糕,不了,我想要吃piza了
// 工厂接口 public interface Factory { // 传入参数的是产品类型,这里返回产品类的抽象工厂类Product public Product factory(String productType); } // 雪糕的工厂,负责生产雪糕 public class IceCreamFactory implements Factory { @Override public Product factory() { return new IceCream(); } } // 商品共性接口 public interface Product { public void product(); } // 你的雪糕来了 public class IceCream implements Product { @Override public void product() { /** * 具体的业务逻辑 */ System.out.println("雪糕做好了!!"); } } // 你想吃PIZZA,那我为你造一个pizza工厂,你看可好 public class PizzaFactory implements Factory { @Override public Product factory() { return new Pizza(); } } // 你的pizza 我为你准备好了 public class Pizza implements Product { @Override public void product() { /** * 具体的业务逻辑 */ System.out.println("披萨做好了!!"); }
// 现在你可以享用了 public class Client {
public static void main(String[] args){ // 生产雪糕 Factory iceCreamFactory = new IceCreamFactory(); Product iceCream = iceCreamFactory.factory(); iceCream.product(); // 生产披萨 Factory pizzaFactory = new PizzaFactory(); Product pizza = pizzaFactory.factory(); pizza.product(); } } }
问题三、 我为什么要使用工厂方法模式来创建对象实例?(优点)
查询资料:
1、优秀的扩展性。假如披萨不想吃了,想吃芝士蛋糕,只需要增加芝士蛋糕的具体工厂和具体产品类,不会影响其他产品的生产。
2、大大降低代码的耦合度,客户端最终得到的是产品本身,而不需要知道和操作产品的生产过程。
个人理解:
起码它现在是满足面向对象编程的思想,然后感觉使用这种方式之后,扩展性变好了,相对于简单工厂模式就好像
将一筐鸡蛋原来是放在一个框子,但是现在放在好几个框子了,这样一个框子的鸡蛋打坏了,不会影响其他的框子
里面的鸡蛋,这应该是就是降低了耦合。
问题四、它有什么缺点
增加新产品时,需要增加具体的工厂类和具体的产品类,当产品数量多的时候就会造成系统的复杂度增大,
也增加了对系统理解的难度。
三、抽象工厂模式
问题一、什么是抽象工厂模式
查阅资料:抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端提供一个接口,使得客户端在
不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象。