1:工厂模式
1.1简单工厂模式
优点:
简单工厂模式,封装了创建对象的逻辑,完成了创建对象逻辑与业务代码逻辑的解耦。
试想客户端是多个service层的文件,对比不使用简单工厂模式,当我们要改变产生对象的逻辑时,
需要在多个service文件中找到这部分代码进行修改。在使用简单工厂模式后,只需要修改简单工厂中生成对象的逻辑即可,
不需要修改业务代码。完成了解耦。
缺点:
每当具体产品类的抽象产品类增多时,会需要在简单工厂类中新增关于新增产品类对象生成的方法。
当抽象产品类很多时,抽象工厂会很臃肿。并且在这种情形下,SimpleFactory类也不符合开闭原则。
public class SimpleFactory {
public static void main(String[] args) {
public static A getFactory(String type){
System.out.println("A1-----------");
System.out.println("A2-----------");
1.2工厂模式
从简单工厂模式的讲述知道:简单工厂的一个缺点在于,每当需要新增产品时,
都需要修改负责生产产品的SimpleFactory类,违背了“开闭原则”,
并且会使SimpleFactory类十分的臃肿。
而使用工厂方法模式后,当新增ProductC时,
只需要对应创建具体产品类ProductC和负责生产ProductC的具体工厂FactoryC即可。符合“开闭原则”,便于扩展。
它的缺点在于:
(1)类的个数容易过多,增加复杂度
(2)实现抽象工厂接口的具体工厂只能生产出一种产品(可以用抽象工厂模式解决)
public static void main(String[] args) {
B b1 = new B1Factory().getB();
B b2 = new B2Factory().getB();
System.out.println("B1----------");
System.out.println("B2----------");
class B1Factory implements Factorys {
class B2Factory implements Factorys {
1.3抽象工厂模式
抽象工厂模式是用于解决“一类产品”的创建问题(在上述场景中,可以把“李宁篮球”,“李宁足球”,“安踏篮球”,“安踏足球”归纳为:“篮球”,“足球”这两类商品)
public class AbstractFactory {
public static void main(String[] args) {
AbstractFactorys lnFactory = new LNFactory();
lnFactory.getFootballFactory().makeFootBall();
lnFactory.getBasketballFactory().makeBasketBall();
AbstractFactorys nkFactory = new NKFactory();
nkFactory.getFootballFactory().makeFootBall();
nkFactory.getBasketballFactory().makeBasketBall();
interface AbstractFactorys{
Football getFootballFactory();
Basketball getBasketballFactory();
class LNFootball implements Football{
public void makeFootBall() {
System.out.println("makeLNFootball-----------");
class NKFootball implements Football{
public void makeFootBall() {
System.out.println("makeNKFootball-----------");
class LNBasketball implements Basketball{
public void makeBasketBall() {
System.out.println("makeLNBasketball-----------");
class NKBasketball implements Basketball{
public void makeBasketBall() {
System.out.println("makeNKBasketball-----------");
class LNFactory implements AbstractFactorys{
public Football getFootballFactory() {
public Basketball getBasketballFactory() {
return new LNBasketball();
class NKFactory implements AbstractFactorys{
public Football getFootballFactory() {
public Basketball getBasketballFactory() {
return new NKBasketball();
