工厂方法模式
工厂方法模式使用平率非常高。日常开发中总能看到它的身影。例如Spring的BeanFactory,MyBatis的DataSourceFactory。
下面举一个例子
比如生产Iphone手机,就可以使用工厂模式。UML 如下
Iphone 手机包含Iphone4,Iphone4s。。。。。。IphoneX 等。
Iphone4,Iphone4s。。。。。。IphoneX都属于Iphone系列,处于同一产品等级(同一产品等级用工厂模式,不同产品等级和产品族用抽象工厂模式)。
代码如下
Iphone 接口
package factory; /** * Created by dingshuangkun on 2018/1/26. */ public interface Iphone { void produceIphone(); }
Iphone4,Iphone5,Iphone6。
package factory.impl; import factory.Iphone; /** * Created by dingshuangkun on 2018/1/26. */ public class Iphone4 implements Iphone { @Override public void produceIphone() { System.out.println("------生产Iphone4--------"); } }
package factory.impl; import factory.Iphone; /** * Created by dingshuangkun on 2018/1/26. */ public class Iphone5 implements Iphone { @Override public void produceIphone() { System.out.println("------生产Iphone5--------"); } }
package factory.impl; import factory.Iphone; /** * Created by dingshuangkun on 2018/1/26. */ public class Iphone6 implements Iphone { @Override public void produceIphone() { System.out.println("------生产Iphone6--------"); } }
Creator 接口
package factory; /** * Created by dingshuangkun on 2018/1/26. */ public interface Creator { <T extends Iphone> T creatorProduct(Class<T> c); }
CreatorFactory
package factory.impl; import factory.Creator; import factory.Iphone; /** * Created by dingshuangkun on 2018/1/26. */ public class CreatorFactor implements Creator { @Override public <T extends Iphone> T creatorProduct(Class<T> c) { Iphone iphone = null; try { iphone = c.newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) iphone; } }
Client
package factory; import factory.impl.CreatorFactor; import factory.impl.Iphone4; import factory.impl.Iphone5; import factory.impl.Iphone6; /** * Created by dingshuangkun on 2018/1/26. */ public class Client { public static void main(String[] args) { Creator creator = new CreatorFactor(); Iphone iphone4 = creator.creatorProduct(Iphone4.class); Iphone iphone5 = creator.creatorProduct(Iphone5.class); Iphone iphone6 =creator.creatorProduct(Iphone6.class); iphone4.produceIphone(); iphone5.produceIphone(); iphone6.produceIphone(); } }
运行结果 如下
------生产Iphone4--------
------生产Iphone5--------
------生产Iphone6--------
Process finished with exit code 0
转载于:https://my.oschina.net/u/3218528/blog/1613546