简单工厂模式,工厂方法模式,抽象工程模式

一、题目分析

  1. 简单工厂模式

使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,请实现该场景。现需要增加一个新的Robot类,如果传入参数R,则返回一个Robot对象,对代码进行修改并注意女娲的变化。

  1. 工厂方法模式

海尔工厂(Haier)生产海尔空调(HaierAirCondition),美的工厂(Midea)生产美的空调(MideaAirCondition) 。使用工厂方法模式描述该场景,绘制类图并编程实现。

  1. 抽象工程模式

电脑配件生产工厂生产内存、CPU等硬件设备,这些内存、CPU的品牌、型号并不一定相同,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现电脑配件生产过程并绘制相应的类图,绘制类图并编程实现。

二、类图设计

(1).简单工厂模式

(2). 工厂方法模式

(3). 抽象工厂模式

扫描二维码关注公众号,回复: 6167274 查看本文章

三、程序实现

(1).简单工厂模式

package MakePeople;

//抽象产品类People

public interface People {

    public void makePeople();

}

//具体产品类Man

public class Man implements People{

    public void makePeople(){

    System.out.println("制造一个男人");

}

}

//具体产品类Woman

public class Women implements People{

    public void makePeople(){

        System.out.println("制造一个女人");

    }

}

//具体产品类Robot

public class Robot implements People{

    public void makePeople(){

        System.out.println("制造一个机器人");

    }

}

//工厂类Nvwa

public class Nvwa {

    public static People getpeople(String create){   

People people=null;

        if(create.equalsIgnoreCase("M")){

           people=new Man();

        }else if(create.equalsIgnoreCase("W")){

           people=new Women();

        }else if(create.equalsIgnoreCase("R")){

           people=new Robot();

        }

        return people;

        }

}

//客户类Client

public class Client {

    public static void main(String[] args) {

           People p1,p2,p3;

           p1=Nvwa.getpeople("M");

           p1.makePeople();

           p2=Nvwa.getpeople("W");

           p2.makePeople();

           p3=Nvwa.getpeople("R");

           p3.makePeople();

        }

       

    }

(2). 工厂方法模式

package AirCondition;

//抽象产品类AirCondition

public interface AirCondition {

    void work();

}

//具体产品类HaierAirCondition

public class HaierAirCondition implements AirCondition{

    public void work() {

        System.out.println("HaireAirCondition is working!");

    }

}

//具体产品类MideaAirCondition

public class MideaAirCondition implements AirCondition{

    public void work() {

        System.out.println("MideaAirCondition is working!");    

    }

}

//抽象产品类AirConditionFactory

public interface AirConditionFactory {

    AirCondition produceAirCondition();

}

//具体产品类HaierAirConditionFactory

public class HaierAirConditionFactory implements AirConditionFactory{

    public HaierAirCondition produceAirCondition() {

        System.out.println("HaierAirCondition produced!");

        return new HaierAirCondition();  

    }

}

//具体产品类MideaAirConditionFactory

public class MideaAirConditionFactory implements AirConditionFactory{

    public MideaAirCondition produceAirCondition() {

        System.out.println("MideaAirCondition produced!");

        return new MideaAirCondition();

    }

}

//测试类AirConditionClient

public class AirConditionClient {

    public static void main(String[] args) {

        AirCondition haierCondition,mideaCondition;

       

        AirConditionFactory HaierConditionFactory=new HaierAirConditionFactory();

        AirConditionFactory MideaConditionFactory=new MideaAirConditionFactory();

        haierCondition = HaierConditionFactory.produceAirCondition();

        mideaCondition = MideaConditionFactory.produceAirCondition();

        System.out.println(); 

    }

}

(3). 抽象工厂模式

package computer;

//抽象产品类CPU

public interface CPU {

    void discribe();

}

//具体产品类PcCPU

public class PcCPU implements CPU{

    public void discribe() {

        System.out.println("This is produce the PcPCU");

    }

}

//具体产品类MacCPU

public class MacCPU implements CPU{

    public void discribe() {

        System.out.println("This is produce the MacCPU");

    }

}

//抽象产品类RAM

public interface RAM {

    void discribe();

}

//具体产品类PcRAM

public class PcRAM implements RAM{

    public void discribe(){

        System.out.println("PcRAM");

    }

}

//具体产品类MacRAM

public class MacRAM implements RAM{

    public void discribe() {

        System.out.println("MacRAM");

    }

}

//抽象产品类ComputerPartsFactory

public interface ComputerPartsFactory {

    CPU produceCPU();

    RAM produceRAM();

}

//具体产品类PcFactory

public class PcFactory implements ComputerPartsFactory{

    public PcCPU produceCPU() {

        System.out.println("PcCPU produced!");

        return new PcCPU();

    }

    public PcRAM produceRAM() {

        System.out.println("PcRAM produced!");

        return new PcRAM();

    }

}

//具体产品类MacFactory

public class MacFactory implements ComputerPartsFactory{

        public MacCPU produceCPU() {

           System.out.println("MacCPU produced!");

           return new MacCPU();

        }

        public MacRAM produceRAM() {

           System.out.println("MacRAM produced!");

           return new MacRAM();

        }

}

//测试类ComputerPartsClient

public class ComputerPartsClient {

    public static void main(String[] args){

        ComputerPartsFactory a=new PcFactory();

        ComputerPartsFactory b=new MacFactory();

        CPU cpu=a.produceCPU();

        RAM ram=b.produceRAM();

        cpu.discribe();

        ram.discribe();

    }

}

四、运行结果

 (1).简单工厂模式运行结果:

(2). 工厂方法模式运行结果:

(3). 抽象工厂模式运行结果:

五、归纳经验

简单工厂中只有一个工厂,该工厂有一个创建产品的方法。根据传入参数不同,返回不同产品。在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化。当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

工厂方法模式是对简单工厂的升级,将工厂抽象出来,工厂基类定义创建产品的方法。每个工厂都需要实现该方法。每个产品对应一个工厂,一个工厂只生产对应产品。

抽象工厂模式是对工厂方法模式的升级。抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。缺点是增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。

三个对比来说,简单工厂由于工厂角色身兼多职,造成程序不够灵活和不易拓展,工厂方法新增加一个抽象工厂将工厂类的职责进行拆分,使得程序容易拓展。抽象工厂使得一个工厂能生产多种产品,就是一个产品族。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_44358097/article/details/89856767