设计模式——1.工厂模式

前言:

本篇博客主要是总结一下自己对工厂模式的认识,例子可能不太恰当,uml类图也可能线用错。不过思想还是正确的

望各位指出错误

一、最简单的工厂模式——简单工厂(静态)模式。

    简单工厂模式严格意义上不属于设计模式

1.UML类图


2.角色分类

    2.1 抽象产品角色:是具体产品角色的共同父类,提供了一个标准接口。

    e.g:   将计算机专业看成一个抽象产品角色

public abstract class CS{
    /**
     * 描述具体专业
     */
    public abstract void major();
}

    2.2 具体产品角色:继承实现抽象产品角色,有自己具体的实现

    e.g:  具体的计算机专业

     物联网工程

public class Iot extends Cs{
    @Override
    public void major() {
        System.out.println("物联网不是搞物流的");
    }
}

    软件工程

public class Soft extends Cs{
    @Override
    public void major() {
        System.out.println("软件工程不一定会修电脑");
    }
}

    2.3 工厂角色:简单工厂模式的核心,创建具体的产品类对象(create方法为静态的)
public class CsFactory {
    public static final int TYPE_IOT = 1;//物联网
    public static final int TYPE_SOFT = 2;//软件工程


    public static Cs CreateMajor(int type) {
        switch (type) {
            case TYPE_IOT:
                return new Iot();
            case TYPE_SOFT:
                return new Soft();
            default:
                return 0;
        }
    }
}


3.  测试类

public class TestFactory{
    public static void main(String args[]){
        Cs cs =new Csfactory.CreateMajor(1); 
         cs.major();
   }
}

4.小结

简单工厂模式主要是为了介绍工厂模式的进门,虽然比较简单,但却是理解的基础,为后面其他工厂模式的理解打下基础、

5.优点&缺点

5.1 优点:使用者无需知道方法的具体实现过程。

缺点 :扩展性差,产生新的计算机专业的时候,需要更改工厂类。(破坏了代码的开闭原则(设计模式原则之一):对扩展开放,对修改关闭)


二、工厂方法模式

1.UML类图


2.对象分类

    2.1 抽象工厂对象:工厂模式的核心,具体工厂对象实现/继承该工厂对象

    e.g.  计算机类专业工厂产生计算机专业

public abstract CsFactory {
      public abstract Cs createCs();
}

    2.2 抽象产品角色:是具体产品角色的共同父类,提供了一个标准接口。

    e.g :  将计算机专业看成一个抽象产品角色

public abstract class Cs{
    public abstract void major();
}

    2.3具体产品角色:继承实现抽象产品角色,有自己具体的实现。

     e.g: 计算机专业分为物联网工程以及软件工程。

public class  Iot extends  Cs{
    @Override
    public void major() {
        System.out.println("物联网工程");
    }
}
public class  Soft extends  Cs{
    @Override
    public void major() {
        System.out.println("软件工程");
    }
}

    2.4  具体工厂对象:实现/继承抽象工厂对象。

    e.g:物联网以及软件工程两个专业有对应的工厂

public class  IotCsFactory extends CsFactory{
    @Override
    public Cs createCs() {
        return new Iot();
    }
}
public class  SoftCsFactory extends CsFactory{
    @Override
    public Cs createCs() {
        return new Soft();
    }
}

3.测试类

public class TestFactory{
    public static void main(String args[]){
      CsFactory iotcsfactory= new IotCsFactory();
      iotcsfactory.createCs().major();
      TeCsFactory softcsfactory= new SoftCsFactory();
      softcsfactory.createCs().major();
}      
}

4.小结

 简单工厂模式的衍生,是对简单工厂模式的抽象。相当于将简单工厂模式中的工厂分为抽象工厂和具体工厂。符合开闭原则,添加新的专业,只要其工厂继承原有抽象工厂,以及本身继承原有的抽象Cs类。

5.缺点

5.1 添加新的专业,除了添加新的专业类,也要提供其对应的具体工厂类。不用改变原来的代码,

5.2 一个具体工厂只能创建一个具体产品。

三、抽象工厂类

1.UML类图


2.角色分类

2.1 抽象工厂对象:工厂模式的核心,具体工厂对象实现/继承该工厂对象

e.g 抽象Cs工厂,会产生物联网以及软件工程两个专业

public abstract AbstractCsFactory {
      public abstract Iot createIot();
      public abstract Soft createSoft();
}

2.2 抽象产品角色:是具体产品角色的共同父类,提供了一个标准接口。

e.g  物联网以及软件专业都可以细分,所以都设置为抽象类

public abstract class Iot{
    public abstract void major();
}
public abstract class Soft{
    public abstract void major();
}

2.3具体产品角色:继承实现抽象产品角色,有自己具体的实现。

e.g 物联网以及软件工程两个专业都有师范和非师范类

public class  TeIot extends  Iot{
    @Override
    public void major() {
        System.out.println("物联网师范");
    }
}
public class  NoTeIot extends  Iot{
    @Override
    public void major() {
        System.out.println("物联网非师范");
    }
}
public class  TeSoft extends  Soft{
    @Override
    public void major() {
        System.out.println("软件工程师范");
    }
}
public class  NoTeSoft extends  Soft{
    @Override
    public void major() {
        System.out.println("软件工程非师范");
    }
}

2.4  具体工厂对象:实现/继承抽象工厂对象。

e.g. 分为师范类工厂和非师范类工厂

public class TeCsfactory extends AbstractCsFactory {  
    @Override  
    public Iot createIot() {  
        return new TeIot();  
    }  
  
    @Override  
    public Soft createSoft() {  
        return new TeSoft();  
    }   
}  
public class NoTeCsfactory extends AbstractCsFactory 
{  
    @Override  
    public Iot createIot() {  
        return new NoTeIOT();  
    }  
    @Override  
    public Soft createSoft() {  
        return new NoTeSoft();  
    }   
}  

3.测试类

public class TestFactory {
	public static void main(String args[]){
		AbstractFactory tefactory = new TeCsfactory ();
		tefactory.createIot().major();
		tefactory.createSoft().major();
	}
}

4.小结

相对于工厂方法模式,抽象工厂模式可以产生多余的其他功能。一个具体的工厂可以产生多个有类似功能的对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值