设计模式-工厂方法模式

来源:互联网 发布:微博来自mac客户端 编辑:程序博客网 时间:2024/05/01 10:50

1.2工厂方法模式
简单工厂模式是不满足OCP(即开闭原则)的,不宜于扩展,而工厂方法模式就是为解决此问题而设计。
工厂方法模式与简单工厂模式最大的不同在于,对于一个独立模块,简单工厂模式只有一个工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

工厂方法模式是类的创建模式,又叫虚拟构造器模式或者多态性工厂模式。工厂方法模式的用意是:创建一个创建产品对象的工厂接口,而实际工作推迟到子类中。工厂方法模式的角色:A,抽象工厂角色:这个是工厂方法模式的核心,它与应用程序无关,是具体工厂角色必须实现的接口或者必须继承的父类。B,具体工厂角色:它含有与具体逻辑相关的代码,由应用程序调用,以创建对应的具体产品角色。C,抽象产品角色:它是具体产品角色实现的接口或者继承的父类。D,具体产品角色:具体工厂角色创建的实例就是对应的具体产品角色实例。在工厂方法模式中,核心的工厂类不在负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心工厂则变为抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触具体产品的创建细节。这种抽象结果,是这种工厂方法模式可以用来允许系统在不修改具体工厂角色的情况下引进新的产品。在工厂方法模式中,一般都有一个平行的等级结构。意思就是说:工厂和产品是对应的,抽象工厂对应抽象产品,具体工厂对应具体产品。一个简单的例子(可同简单工厂模式对比)
/**     *抽象产品角色:运动员     */    public interface SportsMan{        public void run();        public void jump();    }    /**     *具体产品角色:足球运动员     */    public class FootBallSportsMan implements SportsMan{        public void run(){}        public void jump(){}    }    /**     *具体产品角色:篮球运动员     */    public class BasketBallSportsMan implements SportsMan{        public void run(){}        public void jump(){}    }    /**     *抽象工厂角色:运动员工厂     */    public interface SportsManFactory{        public void registerSportMan();    }    /**     *具体工厂角色:足球运动员工厂     */    public class FootBallSportsManFactory implements SportsManFactory{        public void registerSportMan(){            return new FootBallSportsMan();        }    }    /**     *具体工厂角色:篮球运动员工厂     */    public class BasketBallSportsManFactory implements SportsManFactory{        public void registerSportMan(){            return new BasketBallSportsMan();        }    }    /**     *客户端:比如某篮球俱乐部为球员注册专业运动员牌照    */    public class ClubCilent{        private SportsMan goalKeeper;        private SportsMan guard;        public void test(){            SportsManFactory factory = new BasketBallSportsMan();            this.goalKeeper = factory.registerSportMan();            this.guard = factory.registerSportMan();            this.goalKeeper.run();            this.guard.jump();        }    }    /**     *客户端:比如某足球俱乐部为球员注册专业运动员牌照    */    public class ClubCilent{        private SportsMan goalKeeper;//守门员        private SportsMan guard;//后卫        public void test(){            SportsManFactory factory = new FootBallSportsManFactory();            //为守门员向球员联盟注册专业足球运动员牌照            this.goalKeeper = factory.registerSportMan();            //为后卫            this.guard = factory.registerSportMan();            this.goalKeeper.run();            this.guard.jump();        }    }
如果需要增加新产品,则只需要增加相应的具体产品类和具体产品工厂类即可。
0 0
原创粉丝点击