工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
工厂方法模式实现时,客户端要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法爸简单工厂的内部逻辑判断转移到了客户端代码来进行,你想要增加功能,本来是改工厂类的,而现在是修改客户端。
入门案例
package com.test.fac01; public class User { private Integer uid; private String uname; public User() { } public User(Integer uid, String uname) { this.uid = uid; this.uname = uname; } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } @Override public String toString() { return "User{" + "uid=" + uid + ", uname='" + uname + '\'' + '}'; } }
package com.test.fac01; public class People { private String pname; private Integer page; public People() { } public People(String pname, Integer page) { this.pname = pname; this.page = page; } public String getPname() { return pname; } public void setPname(String pname) { this.pname = pname; } public Integer getPage() { return page; } public void setPage(Integer page) { this.page = page; } @Override public String toString() { return "People{" + "pname='" + pname + '\'' + ", page=" + page + '}'; } }
package com.test.fac01; public interface IUser { void insert(User user); void getByUid (Integer uid); }
package com.test.fac01; public interface IPeople { void insert(People people); void getByPid(Integer pid); }
package com.test.fac01; public class AsessServerFactory implements IFactory { @Override public IUser CreateUser() { return new AsessServerUser(); } @Override public IPeople createPeople() { return new AsessServerPeople(); } }
package com.test.fac01; public class SqlServerFactory implements IFactory { @Override public IUser CreateUser() { return new SqlserverUser(); } @Override public IPeople createPeople() { return new SqlserverPeople(); } }
package com.test.fac01; public class SqlserverPeople implements IPeople { @Override public void insert(People people) { System.out.println("新增一条数据" + people + "新用户" + "【SqlserverPeople】"); } @Override public void getByPid(Integer pid) { System.out.println("根据" + pid + "查询用户" + "【SqlserverPeople】"); } }
package com.test.fac01; public class SqlserverUser implements IUser { /** * TODO 新增用户 */ @Override public void insert(User user){ System.out.println("新增一条数据" + user + "新用户" + "【SqlserverUser】"); } /** * TODO 查询用户 */ @Override public void getByUid(Integer uid){ System.out.println("根据" + uid + "查询用户" + "【SqlserverUser】"); } }
package com.test.fac01; public class AsessServerPeople implements IPeople { @Override public void insert(People people) { System.out.println("新增一条数据" + people + "新用户" + "【AsessServerPeople】"); } @Override public void getByPid(Integer pid) { System.out.println("根据" + pid + "查询用户" + "【AsessServerPeople】"); } }
package com.test.fac01; public class AsessServerUser implements IUser { @Override public void insert(User user) { System.out.println("新增一条数据" + user + "新用户" + "【AsessServerUser】"); } @Override public void getByUid(Integer uid) { System.out.println("根据" + uid + "查询用户" + "【AsessServerUser】"); } }
package com.test.fac01; public class MainTest { public static void main(String[] args) { /** * TODO 使用工厂方法模式 */ User user = new User(); IFactory factory = new AsessServerFactory(); IUser iUser = factory.CreateUser(); iUser.insert(user); iUser.getByUid(user.getUid()); System.out.println("================================="); People people = new People(); IFactory factory1 = new SqlServerFactory(); IPeople iPeople = factory1.createPeople(); iPeople.insert(people); iPeople.getByPid(people.getPage()); } }