1.简单工厂模式
1.1 定义接口
private interface Car{
String getName();
};
1.2定义实现类实现接口,具体种类看业务
public class baoma implenments Car{
@override
public String getName(){
return "baoma";
}
}
public class benchi implenments Car{
@override
public String getName(){
return "benchi";
}
}
定义工厂类,方便使用
public class factory(){
public static Car getFactory(String name){
Car car =null;
if("baoma".equles(name))
car = new baoma();
}else if("benchi".equles(name)){
car = new benchi();
}
}
简单工厂模式通过参数传递,来绝对实例的创建,但如果维护起来,需要在工厂类进行修改,不符合开闭原则,所以工厂类可以进行优化
public class factory(){
public static Car getFactory(Class clazz){
Car car = clazz.getInstance();
rerutn car;
}
通过java的反射机制,参数由name 变成class ,符合开闭原则,工厂类不需修改。
2.抽象工厂模式
特点,支持多个产品族,多个等级
产品族概念:美的品牌属于一个产品族,产品族下包括,水壶,冰箱,洗衣机等产品
产品等级概念:美的有冰箱,哈尔有冰箱,不同产品族的同一个产品,叫产品等级
2. 接下来我们定义一个对User进行操作的接口:
public interface IUser {
public void insert(User user);
public User getUser(int uid);
}
3. 实现一个对mysql中User进行操作的类:
public class mysqlUser implements IUser{
public void insert(User user){
System.out.println("在mysql中的user表中插入一条元素");
}
public User getUser(int id){
System.out.println("在mysql中的user表得到id为"+id+"的一条数据");
return null;
}
}
实现对oracle中User进行操作的类:
public class oracleUser implements IUser{
@Override
public void insert(User user) {
System.out.println("在oracle中的user表中插入一条元素");
}
@Override
public User getUser(int uid) {
System.out.println("在oracle中的user表得到id为"+uid+"的一条数据");
return null;
}
}
4. 接下来定义一个工厂接口,用于生产访问User表的对象:
public interface sqlFactory {
public IUser createUser(); //用于访问User表的对象
}
5. 生产mysqlUser对象的mysql工厂类:
public class mysqlFactory implements sqlFactory {
@Override
public IUser createUser() {
return new mysqlUser(); //访问mysql中User表的对象
}
}
生成oracleUser对象的oracle工厂类:
public class oracleFactory implements sqlFactory {
@Override
public IUser createUser() {
return new oracleUser(); //访问oracle中User表的对象
}
}
6. 最后用户测试类如下:
public class test_abstractFactory {
public static void main(String[] args) {
sqlFactory factory1 = new mysqlFactory();
IUser userOperator = factory1.createUser();
userOperator.getUser(1);
userOperator.insert(new User());
}
}