java设计模式之工厂方法模式

41 篇文章 0 订阅
21 篇文章 0 订阅

     设计模式系列
工厂方法模式
     工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。
     工厂方法模式的四个角色
     1、抽象产品角色:它是定义产品的接口,是工厂方法模式所创建的对象的超类型,也就是产品对象的公共父类。
     2、具体产品角色:它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工场和具体产品之间一一对应。
     3、抽象工厂:在抽象工厂类中声明了工厂方法,用于返回一个产品,抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。
     4、具体工厂:它是抽象工厂的实现类,实现了在抽象工厂中声明的工厂方法,并可由客户端调用,返回一个具体产品类的实例。
下面我将以一个例子来说明一下。将我写的简单工厂模式中的例子来改为工厂方法模式,使用工厂放模式模拟女娲造人,通过造人的工厂可以分别获得男人、女人和机器人
下面分别是简单工厂模式和工厂方法模式的图示:
简单工厂模式
工厂方法模式
     代码:
     第一步:创建抽象产品角色(Person接口)

/**
 * @author
 * @date 2020/11/29
 * 抽象产品(人)接口
 */
public interface Person {
    /**
     * 得到人的方法
     */
    void getPerson();
}

     第二步:创建具体产品角色:男人、女人和机器人

/**
 * 具体产品(男人)角色
 */
public class PersonMan implements Person{
    /**
     * 得到男人的方法
     */
    @Override
    public void getPerson() {
        System.out.println("男人得到了------");
    }
}
/**
 * 具体产品(机器人)角色
 */
public class PersonRobot implements Person{
    /**
     * 得到机器人的方法
     */
    @Override
    public void getPerson() {
        System.out.println("机器人得到了-------");
    }
}
/**
 * 具体产品(女人)角色
 */
public class PersonWoman implements Person{
    /**
     * 得到女人的方法
     */
    @Override
    public void getPerson() {
        System.out.println("女人得到了--------");
    }
}

     第三步:创建抽象工厂角色:

/**
 * 抽象工厂角色(生产人的工厂)
 */
public interface ProducePersonFactory {
    /**
     * 生产人的方法
     * @return
     */
    Person producePerson();
}

     第四步:创建具体工厂角色:

/**
 * 具体工厂角色(生产男人)
 */
public class GetPersonMan implements ProducePersonFactory{
    /**
     * 生产男人的方法
     * @return
     */
    @Override
    public Person producePerson() {
        Person personMan=new PersonMan();
        System.out.println("男人生产了-----");
        return personMan;
    }
}
/**
 * 具体产品角色(生产机器人)
 */
public class GetPersonRobot implements ProducePersonFactory{
    /**
     * 生产机器人的方法
     * @return
     */
    @Override
    public Person producePerson() {
        Person personRobot=new PersonRobot();
        System.out.println("机器人生产了-----");
        return personRobot;
    }
}
/**
 * 具体工厂角色(生产女人)
 */
public class GetPersonWoman implements ProducePersonFactory{
    /**
     * 生产女人的方法
     * @return
     */
    @Override
    public Person producePerson() {
        Person personWoman=new PersonWoman();
        System.out.println("女人生产了-----");
        return personWoman;
    }
}

到这里工厂方法模式已经写完,下面我们来调用一下:

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.testGetPerson();
    }

    public void testGetPerson() {
        //获得女人
        ProducePersonFactory getPersonFactory = new GetPersonWoman();
        //先生产女人
        Person personWoman=getPersonFactory.producePerson();
        //再得到女人
        personWoman.getPerson();
    }
}

下面是运行结果:

Connected to the target VM, address: '127.0.0.1:50815', transport: 'socket'
女人生产了-----
女人得到了--------
Disconnected from the target VM, address: '127.0.0.1:50815', transport: 'socket'

     总结:工厂方法模式相比简单工厂模式,在我们要增加一个阴阳人的功能时,简单工厂模式需要修改工厂类,而工厂方法模式则不需要修改原有的工厂类,只需要再增加一个具体产品角色和具体工厂角色即可,原有的代码无需改动。
     工厂模式的优缺点:
     优点:
     在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节。
     基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。
     在系统中加入新产品时无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品即可。
     缺点:
     在添加新产品时需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加。
     由于考虑到系统的可拓展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值